0

我最近在我的 MVC 4 应用程序中添加了带有 SqlServer Silk 的 Microsoft.Practices.EnterpriseLibrary.SemanticLogging (v6)。

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);

但我收到一个错误

*已经有一个带有 Guid XXX XXX XXX XXX 的 EventSource 实例 *

有人有什么主意吗?谢谢

4

1 回答 1

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>();
于 2013-10-22T20:31:10.317 回答