2010-05-27 5 views
4

내 도메인에는 비즈니스 로직의 대부분을 수용하는 소수의 "프로세서"클래스가 있습니다. 기본 규칙으로 StructureMap을 사용하여 다양한 I/O (데이터베이스, 파일 시스템 등)에 대한 클래스에 리포지토리를 삽입합니다. 예를 들어 :StructureMap - 기본 클래스에 종속성 삽입?

public interface IHelloWorldProcessor 
{ 
    string HelloWorld(); 
} 
public class HelloWorldProcessor : IHelloWorldProcessor 
{ 
    private IDBRepository _dbRepository; 
    public HelloWorldProcessor(IDBRepository dbRepository) 
    { 
     _dbRepository = dbrepository; 
    } 
    public string HelloWorld(){ return _dbRepository.GetHelloWorld(); } 
} 

지금, 나는 모든 프로세서를 사용할 수 있도록하고 싶습니다 일부 저장소있다, 그래서 나는이 같은 기본 클래스 제작 :

public class BaseProcessor 
{ 
    protected ICommonRepository _commonRepository; 
    public BaseProcessor(ICommonRepository commonRepository) 
    { 
     _commonRepository = commonRepository; 
    } 
} 

을하지만 내 다른 프로세서는 상속 할 때 그것으로부터, 제로 인수를 취하는 BaseProcessor에 대한 생성자가 없다는 각각의 컴파일러 오류가 발생합니다.

내가 여기서하려는 일을 할 수있는 방법이 있습니까? 즉, 다른 클래스가 각각에 주사를 쓰지 않고 사용할 수있는 기본 클래스에 공통 종속성을 주입시키는 것입니까?

답변

4

아니요. 이는 C# 언어 요구 사항이며 StructureMap 제한 사항이 아닙니다. 파생 클래스는 기본 생성자에 값을 전달해야합니다. 공통 서비스를 주입하기 위해 기본 클래스 만 사용하는 경우 아무 것도 얻지 못합니다. 공통 서비스를 필요로하는 각 클래스에 넣으십시오. IoC 도구가이를 처리합니다. 무엇이 위험입니까?

+0

나는 실제적인 피해가 없다고 생각합니다. 나는 조금 더 통합하려고했습니다. 코드를 조금 더 깨끗하게 만듭니다. 이제 모든 클래스의 생성자에 공통적 인 종속성을 포함 시키거나 기본 클래스의 종속성을 수동으로 인스턴스화하는 것 (생성자 인수가 아니라 ObjectFactory.GetInstance())이 필요합니다. 내 IoC 컨테이너를 추상화하여 두 번째 옵션을 좀 더 편안하게 만들 때가 된 것 같네요. – David

+2

Nooooo ... 나쁜 길로 갈 것입니다. 당신이 생성자 매개 변수의 수에 불편을 느끼기 때문에 서비스 위치를 강요 할 수 있습니까? 제발 하지마. 공통 종속성의 수가 많으면 다른 서비스에 포함시켜야하는 몇 가지 공통 기능이있을 수 있습니다. 이 서비스는 여러 종속성을 취하고이를 필요로하는 작업을 수행합니다. 그런 다음 해당 서비스를 다른 생성자에 삽입합니다. 그것은 "상속에 대한 선호도 구성"이 의미하는 바입니다. –

2

원하는 것은 속성 주입입니다. 파생 클래스를 기본 클래스의 구체적인 인스턴스로 사용하지 않으므로 기본 클래스가 종속성이있는 공용 속성을 가질 수 있습니다. 파생 클래스의 인터페이스를 항상 사용해야합니다.

여기에 대한 대답은 생성자 삽입에서 눈부신 약점을 피하고 기본 클래스에서 속성 주입을 사용하는 것입니다.

+0

모델링 이유로 공통 기본 클래스가 있다면 나는 당신과 동의 할 것입니다. 그러나 그는 의존성을 가져 오는 유일한 목적을 위해 "인공적인"기본 클래스를 만들고 있습니다. 좋지는 않을거야, 재산 주입 여부. –