2014-09-28 2 views
0

이론적 인 질문 : 새로운 것은 아니지만 설정 멤버 외에는 생성자에서 작업하지 않는 것이 가장 좋습니다.DI - 생성자가 아닌 "일을하는 방법"

클래스가 제대로 작동하려면 디스크에서 구성원에게 파일을로드해야하는 간단한 예제 (종속성 삽입)에서 "작업"을 어디에서 수행해야합니까? 일부 초기화 함수에서 호출해야한다는 것을 기억해야합니까? 예를 들어

:

XDocument.Load(someFilePath) ; 

답변

2

가장 좋은 방법은 주입 생성자 마크 시만 명확 here 설명으로에서 어떤 일을하지 않는 것입니다. 따라서 디스크에서 파일을로드해야하는 경우 시작할 때 (가능한 경우) 수행하거나 생성을 연기하고 객체 그래프가 작성된 후에 수행해야합니다. 이것은 일반적으로 불쾌한 해결 방법이 아니며 Lazy는 사물 만들기를 연기하는 위대한 메커니즘입니다. 예 :

class ApplicationConfiguration 
{ 
    private readonly Lazy<XDocument> configFile; 

    public ApplicationConfiguration(Lazy<XDocument> configFile) { 
     this.configFile = configFile; 
    } 

    public T GetValue<T>(string key) { 
     return (T)this.configFile.Value.Root.Find(key).Value; 
    } 
} 

약 1 경고 : Lazy<T>. 사물 제작을 연기하는 데 사용할 수는 있지만 (또는 사용해야 함), 누설 된 추상화로 남용하지 않도록하십시오. 예를 들어 많은 클래스에 동일한 Lazy<T> 종속성을 삽입하지 마십시오. 예를 들어, 추상화가 ILogger이고 시간을 많이 들여 구현할 수 있다고 가정 해 보겠습니다. Lazy<ILogger>을 여기 저기에 주입하기 시작하면 좋겠지 만,이 로거가 작성하는 데 비용이 많이 든다는 사실 때문에 구현 세부 사항이 누출되고 있습니다. 그러나 지금은 ILogger의 모든 소비자가 이에 대해 알고 있습니다. 이 최적화를 깨기 위해서 우연히 ILogger을 한 번 직접 주입해야합니다.

대신 ILogger을 구현하고 Lazy<ILogger>에 종속 된 프록시 클래스를 만들어이 프록시를 모든 소비자에게 주입하십시오. 이렇게하면 모든 소비자는 로거 생성이 지연된다는 것을 알 필요없이 ILogger에 따라 계속 유지할 수 있습니다.