2013-02-19 3 views
0

이 질문은 이상하게 보일 수 있지만 실제로 생성자 서명을 수정해야하는 경우가 있습니다.왜 C#에서 생성자의 서명을 제한 할 방법이 없습니까?

예를 들어 DI에서 의존성을 해결하기를 원합니다. 그리고 생성자가 확장되고 더 많은 매개 변수를 필요로하는 경우 일부는 상황에 따라 크게 달라 지므로 문제가 발생합니다.
DI 컨테이너가 종속성을 해결할 수없는 경우 예외가 발생하지만 이것이 내가 생각하는 최선의 방법은 아닙니다.

난 단지 우리의 응용 프로그램을 리팩토링하고, DI를위한 좋은 후보자가 될 것으로 계획되었던 것이 결과를 이해하지 못하는 의도적 인 생성자 확장으로 인해 지금 무너지고 있음을 이해합니다. 이를 막을 수있는 유일한 방법은 개발자 간의 컨벤션입니다.
언어 지원이 매우 유용 할 수 있지만 C#과 Java 모두 지원하지 않습니다.

그래서이 기능이 구현되지 않은 이유가 있어야한다고 생각합니다. 왜요? 여기

는 우리의 공장과 같은 모습입니다 : 추가 PARAMS 반면

public class EntityBase : IEntity 
{ 
    public EntityBase(IBusinessModel model, IAppContext context) 
    { 
    } 
} 

public class DescendatnEntity : EntityBase, IDescendatnEntity 
{ 
    public DescendatnEntity(IBusinessModel model, IAppContext context, ...additional params...) 
    { 
    } 
} 

public interface IEntitiesFactory 
{ 
    IEntity GetBaseEntity(); 
    IDescendantEntity GetDescendantEntity(...those additional params...); 
} 

IBusinessModelIAppContext 싱글은 일시적이다.

호출자 만이 일시적인 매개 변수 값을 알고있는 경우 팩토리가이 매개 변수에 대해 알 필요가 없습니다.

+0

생성자를 선으로 가져 오면 궁극적으로 이들 클래스가 종속성을 갖게 될까요? – Jon

+1

* 생성자 시그너처 고정 *은 무엇을 의미합니까? –

+2

유형을 생성하는 데 사용할 수있는 팩토리 클래스를 작성하기 만하면됩니다. – Servy

답변

0

기본 구현을 제공하기 위해 생성자 연결을 사용할 수 있습니다.

public class DescendantEntity : EntityBase, IDescendatnEntity 
{ 

    public DescendantEntity(IBusinessModel model, IAppContext context, ...additional params...) 
    { 
    } 
    public DescendantEntity(IBusinessModel model, IAppContext context) 
     this(model, context, ...additional params defaults...) 
    { 
    } 
} 
+0

이미 사용 중입니다. 문제는 기본 구현에 없습니다. 문제는 공장에서 해결 된 각 종속성에 대해 이러한 추가 매개 변수에 대해 알아야한다는 것입니다. –

+0

@voroninp 팩토리에 의존성을 알리고 싶지 않다면 의존성을 다른 클래스로 리팩터링 할 수있다. – Romoku

+0

공장이 constraction 하에서 의존성에 제공 할 수있는 의존성에 대해 알고 싶습니다. 단순한 문제는 개발자가 건설 프로세스와 관련없는 일부 매개 변수를 추가하여 생성자가 변경되도록 허용한다는 것입니다. 예, 클래스를 동일한 생성자로 리팩토링해야합니다. –

관련 문제