2016-08-31 20 views
0

使用c#MVC和Simple Injector通過Simple Injector構建時,將SessionId添加到Logger

我的記錄器是這樣創建的;

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

而且這被傳遞到所有需要它的類。但是,我需要一種識別發生在用戶身上的事件的方式。在我看來,最簡單的實現方法是將sessionId傳入記錄器,這樣每次使用記錄器的類,無論是控制器,業務類還是數據處理類,都可以跟蹤單個會話事件。

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

將無法​​正常工作,在應用程序啓動時HttpContextnull。我能看到的唯一方法是在每次調用控制器構造函數時手動將sessionId設置到記錄器中。但這似乎是違反直覺的。那麼如何將當前的SessionId(或唯一標識符)傳遞到我的記錄器中。

+0

您可以註冊一個全球性的[操作過濾器(HTTPS

public interface IUserContext { int SessionId { get; } } 

如下這樣可以實現://msdn.microsoft.com/en-us/library/gg416513%28VS.98%29.aspx)它將在執行動作之前執行('OnActionExecuting') –

+0

感謝Stron。我更喜歡其他答案,因爲它與我的解決方案的其餘部分一致。 – Matt

回答

2

您遇到的問題是由您0123¾引起的。這是一種反模式,應該被阻止,因爲:

它會導致模糊不清,使組合根更加複雜,並且使您極其難以驗證DI配置的正確性。

的解決方案是:

設運行時數據流通過構造的對象圖的方法調用。

鏈接的文章還描述了您的問題的解決方案,即提取抽象背後的運行時值。例如:

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); 
相關問題