0

我剛剛在我的MVC 4應用程序中添加了Microsoft.Practices.EnterpriseLibrary.SemanticLogging(v6)和SqlServer silk。(Microsoft.Practices.EnterpriseLibrary.SemanticLogging)在SqlDatabaseLog.EnableEvents中注入EventSource

var sqlListener = SqlDatabaseLog.CreateListener("SampleEventLogger",strConnection); 
sqlListener.EnableEvents(BasicLogger.Log, EventLevel.LogAlways); 

這是代碼在我的控制器

BasicLogger.Log.Critical("ERROR CRITICAL"); 

它工作得很好!

...和現在的障礙:) 在我的MVC應用程序中,我使用Unity的DI和我注入構造函數ILogger接口。 因爲我需要使用我已經註冊到統一容器中的相同引用(否則不起作用),所以我認爲採用RegisteredType可能是解決方案。

var myRegistereType = container.Resolve<ILogger>(); 
sqlListener.EnableEvents(myRegistereType, EventLevel.LogAlways); 

,但我收到一條錯誤

* 已經有的EventSource的GUID爲XXX XXX XXX XXX *實例

沒有人有任何想法? 謝謝

回答

0

應該只有一個EventSource的實例。這就是爲什麼您通常會看到暴露單例實例的EventSource(例如BasicLogger.Log)。

如果您使用Unity,您必須將EventSource註冊爲單例或使用其他方法導致返回一個實例。以下是使用InjectionFactory和Log屬性執行此操作的一種方法:

IUnityContainer container = new UnityContainer(); 

container.RegisterType<ILogger>(
    new InjectionFactory(c => BasicLogger.Log)); 

var logger = container.Resolve<ILogger>();