나는 의존성 주입을위한 생성자 주입을 좋아합니다. 이것은 유형에 대한 명확한 선언을 강요하고 테스트 가능성에 도움이됩니다.생성자 주입 대체물 (Castle Windsor)
나는 생성자 가장 장소에서 분사, ... 나는 그것을 좋아하지 않아 예를 들어
로깅을 좋아합니다. 많은 다른 클래스가 상속하는 기본 클래스가 있고 모든 클래스가 ILogger (또는 무엇이든)의 인스턴스를 사용하기를 원합니다. 정적 팩터 리 (Logger.Instance)를 원하지 않습니다. ILogger를 취하는 모든 하위 클래스에 생성자를 선언하고 싶지는 않습니다.
그래서, 난 내 기본 클래스 속성으로 로거를 선언하고 그 방법
public class MyBaseClass
{
public ILogger Logger { get; set; }
}
주입이 가질 수 ...하지만
- 그 로거 저를 보장하지 않는 사실이 주입되고 null이 아닙니다.
- 나는 공공 세트
그래서 ... 내가해야합니까 어떤 다른 옵션과 함께하는 ILogger을 가진 좋아하지 않아? (캐슬 윈저를 사용하고 있습니다).
내가 인터페이스
public interface IInitializable<T>
{
void Initialize(T instance);
}
public class MyBaseClass : IInitializable<ILogger>, ...could have other IInitializables too...
{
protected ILogger Logger { get; private set; }
public void Initialize(ILogger instance)
{
Logger = instance;
}
}
다음
자동 형 구조에 따라 IInitializable<T>
의 모든 구현을 호출 내 컨테이너에 시설을 가진를 만들기 고려했습니다 ...
그러나 나는 무엇을 다른 사람을 궁금하네요 '생각이 그 길을 가기 전에 ...
왜 정적 팩토리 패턴을 사용하지 않으시겠습니까? –
Ctor 주입 등은 테스트를위한 다양한 구현에 매우 유용합니다. 그러나 개별적으로 로깅을 위해 실제로 필요합니까? 인스턴스 수준에서 로깅 구현을 변경하는 기능이 정말로 필요합니까? 정적 팩토리 패턴은 여전히 필요한 전반적인 * 로깅 구현을 변경할 수있는 기능을 제공합니다. –
반환 할 Logger의 구현이 동적이어야합니다. 특히 Logger.Instance는 컨텍스트 (예 : WCF 작업, WPF 클라이언트, SL 클라이언트 등)에 따라 달라야합니다. 나는 서비스 내역을 .Current 내부에서 처리 할 수있을 것 같지만, 이해할 수있는 반 패턴입니다. – Jeff