2012-11-02 2 views
1

WPF 응용 프로그램을 구축 중입니다. 나는 Prism 4와 Unity를 사용하고 있습니다. 응용 프로그램에 로깅 및 예외 처리라는 두 개의 Enterprise Library 5 블록을 추가하려고합니다. ILoggerFacade를 지원하는 Infrastructure 클래스에 싱글 톤 LoggerFacadeCustom.cs가 있으며 부트 스트 래퍼에서 로그 파일을 생성했습니다. 그것의 생성자 (유니 코드 컨테이너)에 유니티 컨테이너를 올리는 "뉴스"프리즘, 유니티 및 엔터프라이즈 라이브러리를 통합하는 방법

어디에서 ExceptionManager 용 container.resolve를 추가합니까? 예외 처리 블록을 부트 스트 래퍼의 ILoggerFacade에 어떻게 연결합니까? 모든 예외가 동일한 로그에 나타나게하려면 어떻게해야합니까?

public class LoggerFacadeCustom : ILoggerFacade { 

    private static readonly LoggerFacadeCustom _instance = new LoggerFacadeCustom(); 
    public static LoggerFacadeCustom Instance { get { return _instance; } } 

    private LoggerFacadeCustom() { 
     var container = new UnityContainer(); 
     container.AddNewExtension<EnterpriseLibraryCoreExtension>(); 

     _logWriter = container.Resolve<LogWriter>(); 
    } 

    private readonly LogWriter _logWriter; 


    public void Write(string message) { Write(message, null); } 

      public void Write(string message, string category, int priority) { 
    _logWriter.Write(message, category, priority); 
    } 

      public void Write(string message, Dictionary<string, object> properties) { 
    _logWriter.Write(message, LiteralString.LogCategoryProcess, properties); 
    } 


    #region ILoggerFacade Members 

    public void Log(string message, Category category, Priority priority) { 
     throw new NotImplementedException(); 
    } 

    #endregion 
    } 

답변

0

귀하의 부트 스트 래퍼는 응용 프로그램의 Composition Root입니다 : 여기에 기존 bootstrapper.cs

public class Bootstrapper : UnityBootstrapper { 

    protected override ILoggerFacade CreateLogger() { 
     return LoggerFacadeCustom.Instance; 
    } 

    protected override DependencyObject CreateShell() { 
     return Container.Resolve<Shell>(); 
    } 

    protected override void InitializeShell() { 
     base.InitializeShell(); 

     App.Current.MainWindow = (Window)Shell; 
     App.Current.MainWindow.Show(); 

    //Other shell stuff... 

    } 

    protected override IModuleCatalog CreateModuleCatalog() { 

     var catalog = new ModuleCatalog(); 

     //These primary modules must register their own services as if they were acting independantly 
     catalog.AddModule(typeof(XmlCommentMergeModule)); 

     //These support modules require at least one primary module above to be added first 
     catalog.AddModule(typeof(ToolboxHeaderModule)); 
     catalog.AddModule(typeof(ToolboxFooterModule)); 
     catalog.AddModule(typeof(ToolboxStartModule)); 
     return catalog; 
    } 
    } 

LoggerFacadeCustom입니다. 거기에 모든 종속성을 등록해야합니다. 그리고 그곳에 만. 컴포지션 루트 외부에서 직접 컨테이너를 참조하면 안됩니다.

클래스에 종속성이있는 경우 constructor injection과 같은 패턴을 사용하여 해당 종속성을 주입해야합니다.

정적 클래스를 사용하지 마십시오. 정적 (Static)은 종속성 주입 및 테스트 가능성을 없애고 모든 것이 모든 곳에서 참조되는 지점까지 종속성을 숨 깁니다.

로거 Facade를 생성자 매개 변수로 설정하십시오. 오류 처리 블록에서도 동일한 작업을 수행 할 수 있습니다.

컨테이너를 ServiceLocator로 사용하지 마십시오. 이는 anti-pattern in modern software architecture으로 간주됩니다.

+0

Microsoft의 프리즘 (Prism) 책에서는 각 모듈의 컨테이너를 사용하여 단일성을 제안합니다. 모듈이 컨테이너를 사용하지 않고 인터페이스를 등록하는 방법을 설명해주십시오. 그러나 DI를 사용하여 컨테이너를 가져와야합니다. – Alan

+0

@Alan 'UnityContainerExtension'에서 파생 된 특정 클래스에 구성을 아웃소싱하고 모듈에 대한 구성을 번들로 사용할 수 있습니다. 부트 스트 래퍼가 해당 클래스를 검색하여 단일 컨테이너 인스턴스에 추가하도록하십시오. 또는 컨테이너 인스턴스를 모듈에 삽입하고 config를 수행 할 수 있습니다. 나는 그것이 유효한 짧은 지름길이라고 생각한다. –

+1

나를 위해 각 모듈에는 IModule 클래스가 있으며 생성자를 통해 컨테이너를 주입합니다. 그런 다음 초기화는 유형을 등록하고 모듈이 소유 한 서비스를 해결합니다. – Alan

관련 문제