0

최근 MVC 4 응용 프로그램에서 SqlServer 실크를 사용하여 Microsoft.Practices.EnterpriseLibrary.SemanticLogging (v6)을 추가했습니다.(Microsoft.Practices.EnterpriseLibrary.SemanticLogging) SqlDatabaseLog.EnableEvents의 주입 이벤트 소스

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

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

그것은 잘 작동 내 컨트롤러에 코드입니다!

... 이제 장애물 : 내 MVC 응용 프로그램에서 DI 용 Unity를 사용하고 생성자 ILogger 인터페이스에 주입합니다. 통합 컨테이너에 등록한 것과 동일한 참조를 사용해야하므로 (그렇지 않으면 작동하지 않습니다.) RegisteredType을 사용하는 것이 해결책 일 수 있다고 생각했습니다.

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

하지만이

사람이 어떤 생각을 가지고 있습니까 가이 드 XXX XXX XXX XXX *와 EventSource의 인스턴스가 이미 있습니다 오류

* 을받은? 감사합니다.

답변

0

EventSource 인스턴스가 하나만 있어야합니다. 이러한 이유로 싱글 톤 인스턴스 (예 : BasicLogger.Log)를 표시하는 EventSource가 표시됩니다.

Unity를 사용하는 경우 EventSource를 싱글 톤으로 등록하거나 하나의 인스턴스가 반환되는 다른 접근 방식을 사용해야합니다. InjectionFactory 및 Log 속성을 사용하여이를 수행하는 한 가지 방법이 있습니다.

IUnityContainer container = new UnityContainer(); 

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

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