2016-08-31 11 views
0

c#MVCとSimple Injectorを使用。シンプルインジェクタで構築したときにセッションIDをロガーに追加

マイロガーはそのように作成されます。

container.Register<ILogger>(() => new Logger("MVC Logging Startup"), Lifestyle.Scoped); 

これは完全に必要なすべてのクラスに渡されます。しかし、私はユーザーに発生するイベントを特定する方法が必要です。私の考えでは、これを実装する最も簡単な方法はsessionIdをロガーに渡すことです。そうすれば、ロガーを使用するクラス、コントローラー、ビジネスクラス、データ処理クラスのいずれでも、個々のセッションイベントを追跡できます。 HttpContextnullあるアプリケーション起動時のよう

container.Register<ILogger>(() => new Logger(this.Session.SessionId), Lifestyle.Scoped); 

は動作しません。私がこれを行うために見ることができる唯一の方法はコントローラのコンストラクタが呼び出されるたびに手動でsessionIdをロガーに設定することです。しかし、それは直観に反しているようです。では、現在のSessionId(または一意の識別子)を自分のロガーに渡すにはどうすればいいですか?

+0

あなたはグローバルな[アクションフィルタ](HTTPSを登録することができますが://msdn.microsoft.com/en-us/library/gg416513%28VS.98%29.aspx)アクションが実行される前に実行されます( 'OnActionExecuting') –

+0

ありがとうStron。他の答えが好きなのは、私の解決策の残りの仕組みに沿っているからです。 – Matt

答えて

2

あなたが抱えている問題は、あなたが原因で発生しましたinjecting runtime data into your components。それは、あいまいさの原因となる余分な責任を有する組成物のルートを複雑にし、それは非常に難しいあなたのDIの設定が正しいかどうかを検証することができ

:これは、アンチパターンで、防止する必要があります。ランタイムデータが構築されたオブジェクトグラフのメソッド呼び出し流れる

LET:

溶液がです。

リンクされた記事では、抽象の背後にある実行時の値を抽出するという、問題の解決法についても説明します。例えば:

public interface IUserContext 
{ 
    int SessionId { get; } 
} 

次のようにこれを実装することができます。

class HttpSessionUserContext : IUserContext 
{ 
    public int SessionId => (int)HttpContext.Current.SessionId; 
} 

次のように今、あなたはあなたの登録を完了することができます

var userContext = new HttpSessionUserContext(); 

container.Register<ILogger>(() => new Logger("MVC Logging Startup", userContext), 
    Lifestyle.Scoped); 
関連する問題