我最近在我的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 for DI,并注入构造函数ILogger接口。因为我需要使用我已注册到 Unity 容器中的相同引用(否则不起作用),所以我认为采用 RegisterType 可能是解决方案。
var myRegistereType = container.Resolve<ILogger>();
sqlListener.EnableEvents(myRegistereType, EventLevel.LogAlways);
但我收到错误
*已经有一个事件源的实例,其 GUID
XXX XXX XXX XXX *有人知道吗?谢谢
事件源应该只有一个实例。 这就是为什么您通常会看到一个事件源公开一个单一实例(例如 BasicLogger.Log
)。
如果您使用的是 Unity,则必须将事件源注册为单一实例,或使用导致返回一个实例的其他方法。 下面是使用 InjectionFactory 和 Log 属性执行此操作的一种方法:
IUnityContainer container = new UnityContainer();
container.RegisterType<ILogger>(
new InjectionFactory(c => BasicLogger.Log));
var logger = container.Resolve<ILogger>();