0

最近、MVC 4 アプリケーションに SqlServer シルクを使用して Microsoft.Practices.EnterpriseLibrary.SemanticLogging (v6) を追加しました。

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

これは私のコントローラーのコードです

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

それはうまくいきます!

...そして今、障害:) 私のMVCアプリケーションでは、DIにUnityを使用し、コンストラクターILoggerインターフェイスに注入します。Unityコンテナに登録したのと同じ参照を使用する必要があるため(そうでなければ機能しません)、RegisteredTypeを使用することが解決策になると考えました。

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

しかし、私はエラーを受け取りました

* Guid XXX XXX XXX XXX を持つ EventSource のインスタンスが既に存在します *

誰にもアイデアはありますか?ありがとう

4

1 に答える 1

0

EventSource のインスタンスは 1 つだけである必要があります。これが、シングルトン インスタンスを公開している EventSource を通常目にする理由です (例: BasicLogger.Log)。

Unity を使用している場合は、EventSource をシングルトンとして登録するか、1 つのインスタンスが返される別のアプローチを使用する必要があります。これは、InjectionFactory と Log プロパティを使用して行う 1 つの方法です。

IUnityContainer container = new UnityContainer();

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

var logger = container.Resolve<ILogger>();
于 2013-10-22T20:31:10.317 に答える