2013-11-25 6 views
1

XML 구성 파일을 래핑하는 .NET 어셈블리가 있습니다. config 파일에는 오류 로그 파일의 경로 및 파일 이름 형식 정보를 비롯한 많은 시스템 설정이 포함되어 있습니다. 다른 어셈블리는 싱글 톤 클래스를 통해이 일을 참조 :순환 참조가없는 시스템 어셈블리에 대한 오류 로깅은 어떻게 처리합니까?

public sealed class SettingsManager 
{ 
    private static volatile SettingsManager manager; 
    private static object syncRoot = new Object(); 

    //... 

    private SettingsManager() 
    { 
     //load XML config file 
    } 

    public static SettingsManager Manager 
    { 
     get 
     { 
      if (manager == null) 
      { 
       lock (syncRoot) 
       { 
        if (manager == null) 
         manager = new SettingsManager(); 
       } 
      } 
      return manager; 
     } 
    } 

    //...... 
    //Methods getting and setting configuration data 
    //...... 
} 

나는 또한 시스템의 나머지 부분에서 오류 처리 및 사용 추적을위한 클래스를 제공하는 Logging 어셈블리를 가지고있다.

SettingsManager.Manager.GetCurrentErrorFileName(); 

는 그래서 Settings 어셈블리가 프로젝트의 다른 어셈블리의 핵심 의존성이다 : 그것은 오류를 저장할 위치를 파악하기 위해 Settings 라이브러리를 참조합니다. 그러나 Settings 라이브러리에 오류를 기록해야한다면 Settings에 대한 참조로 Logging 어셈블리를 참조 할 수 없으므로 순환 참조가 있습니다.

내가 부딪히는 문제는 Settings 라이브러리의 XML 파일 루틴에서 생성되는 오류를 처리하는 방법입니까? 이 오류가 기록 할 기본 파일 위치를 하드 코드합니까? 이 경우 가장 좋은 방법은 무엇입니까?

시스템 이벤트 로그에 대해 생각했지만이 어셈블리는 Windows 서비스와 호스팅 된 MVC 웹 사이트에서 모두 사용됩니다. 그래서 이벤트 로그가 옵션이라고 생각하지 않습니다.

답변

3

두 단어 ... dependency injection.

귀하의 Logging 조립품은 Settings 조립품에 대해 전혀 알지 못합니다. 아마 중 하나를해야합니다

  1. 아마도 (일부 환경 변수는
  2. 기록 할 곳을 알려 뭔가 기대 제공하지 않을 경우 합리적인 기본값은 어디에서 로그인하는 방법을 알려주는 응용 프로그램 도메인에 설정 될 것으로 예상 로거에 속성을 설정하여)

어느 옵션에서나 응용 프로그램의 진입 점이이를 수행하기에 좋습니다. 어쩌면 처음 몇 줄의 코드에서 다음과 같이 할 수 있습니다.

Logger.LogFilePath = Settings.Manager.GetCurrentErrorFileName(); 
+0

내가 수행 한 대부분의 응용 프로그램은 사내 프로젝트 또는 간단한 .NET 또는 MVC 웹 사이트였습니다. 그러나이 프로젝트에 깊이 들어가면 IoC와 Dependency Injection의 개념에 대해 더 많은 것을 알게되었습니다. 그러나 그것은 나에게 여전히 새로운 개념이다. IoC와 의존성 삽입에 대한 다른 좋은 참조 정보가 있다면, 그 정보가 무엇인지 알고 싶습니다. (나는 당신이 지금에 링크 된 기사를 읽고있다). – jwatts1980

+0

나는 이것을 좋아한다 : [IoC 컨테이너는 가지고 있지 않은 문제를 해결하지만 가지고있는 것은 좋은 문제이다.] (http://kozmic.net/2012/10/23/ioc-container-solves-a-problem-you 그다지 좋은 것은 아니다.)하지만, 오랫동안 읽었을 때 큰 차이가있다. 여기에 [다른 하나] (http://blogs.msdn.com/b/nblumhardt/archive/2008/12/27/container-managed-application-design-prelude-where-does-the-container-belong.aspx)가 있습니다. 그건 더 짧아. –

+0

또는 주제에 관한 책이 필요하면 Mark Seemann의 [_Dependency Injection in .NET_] (http://manning.com/seemann/)을 참조하십시오. –