2016-09-09 6 views
0

내가이 수업을 상상해클래스에 인젝션 된 의존성의 다른 구현을 사용하게하는 방법은 무엇입니까?

public class MyClass : IMyClass 
{ 
    private readonly ISomething1 _something1; 
    private readonly ISomething2 _something2; 

    public MyClass(ISomething1 something1, ISomething2 something2) 
    { 
     _something1 = something1; 
     _something2 = something2; 
    } 

    public SomeObject Get(AnotherObject anotherObject) 
    { 
     var a = _something1.Calculate(anotherObject.Property1); 
     var b = _something2.Get(anotherObject.Property2, a); 

     return b; 
    } 
} 

public class MyClass2 : IMyClass 
{ 
    private readonly ISomething1 _something1; 
    private readonly ISomething2 _something2; 

    public MyClass(ISomething1 something1, ISomething2 something2) 
    { 
     _something1 = something1; 
     _something2 = something2; 
    } 

    public SomeObject Get(AnotherObject anotherObject) 
    { 
     var a = _something1.Calculate(anotherObject.Property1); 
     var b = _something2.Get(anotherObject.Property2, a); 

     return b; 
    } 
} 

MyClass 추천하고 Myclass2 것은 동일 보인다. 그러나, 차이가 나는 Ninject 사용하여 이러한 클래스에 대한 ISomething1ISomething2의 다른 구현을 주입하고 있다는 점이다 : 그것은 DRY 원칙을 위반

//MyClass 
Bind<ISomething1>().To<AmazingSomething>().WhenInjectedInto<MyClass>(); 
Bind<ISomething2>().To<BeautifulSomething>().WhenInjectedInto<MyClass>(); 

//MyClass2 
Bind<ISomething1>().To<GoodSomething>().WhenInjectedInto<MyClass2>(); 
Bind<ISomething2>().To<UglySomething>().WhenInjectedInto<MyClass2>(); 

나는이 솔루션을 좋아하지 않는다. 그러나, 나는 그것을 좋아한다. 왜냐하면 그것은 열린/닫힌 원리 (나는 희망한다)를 따르고 있기 때문이다.

내 목표를 달성하는 더 좋은 방법이 있습니까?

+1

당신이 말한대로 클래스가 동일하기 때문에 그것은 코드 냄새가 나는 것처럼 보입니다. 런타임시에만 다릅니다. MyClass1/2 객체의 수명주기에 대한 정보가 없으면 팩토리 패턴을 사용하는 것입니다. –

+0

@rboe 당신은'MyClass' 안에서'ISomething1'과'ISomething2'를위한 팩토리를 사용한다는 것을 의미합니까? –

+0

@rboe'_something1Factory.Get (someType) .Calculate (anotherObject.Property1)'와 같은 무엇인가? –

답변

1

분명히 MyClass2이 필요하지 않습니다.

IMyClass 구현을 생성하고, 사용자 정의 논리를 사용하여 어떤 ISomething1ISomething2 구현을 삽입 할지를 결정하는 데 가장 가능성이 큽니다.

저는 프로젝트에서 Ninject를 사용하지 않지만, 당신이 의존성에 메타 데이터를 첨부 할 수 있다고 믿습니다. 그러면 선택 논리를 구현하는 데 도움이 될 것입니다.

예컨대,이 같은 사용하여 가난한 사람의 DI가있을 것입니다 뭔가 :

public class MyClassFactory 
{ 
    public IMyClass Create() 
    { 
     if (DateTime.Today.DayOfWeek = DayOfWeek.Friday) 
     { 
      return new MyClass(new ASomething1(), new ASomething2()); 
     } 

     return new MyClass(new BSomething1(), new BSomething2()); 
    } 
} 

그래서, 공장 코드는 모든 객체가 인스턴스화와 결합되어야 방법에 따라 달라집니다.

+0

감사합니다. 나는 그것이 Ninject에서 어떻게 이루어 졌는지를 발견했다. - https://github.com/ninject/Ninject.Extensions.Factory/wiki/Factory-interface:-Referencing-Named-Bindings#using-whenanyancestornamedlikefactorymethod-to-define-conditional-bindings- 공장에서의 방법. –