내가이 수업을 상상해클래스에 인젝션 된 의존성의 다른 구현을 사용하게하는 방법은 무엇입니까?
는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
사용하여 이러한 클래스에 대한 ISomething1
및 ISomething2
의 다른 구현을 주입하고 있다는 점이다 : 그것은 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>();
나는이 솔루션을 좋아하지 않는다. 그러나, 나는 그것을 좋아한다. 왜냐하면 그것은 열린/닫힌 원리 (나는 희망한다)를 따르고 있기 때문이다.
내 목표를 달성하는 더 좋은 방법이 있습니까?
당신이 말한대로 클래스가 동일하기 때문에 그것은 코드 냄새가 나는 것처럼 보입니다. 런타임시에만 다릅니다. MyClass1/2 객체의 수명주기에 대한 정보가 없으면 팩토리 패턴을 사용하는 것입니다. –
@rboe 당신은'MyClass' 안에서'ISomething1'과'ISomething2'를위한 팩토리를 사용한다는 것을 의미합니까? –
@rboe'_something1Factory.Get (someType) .Calculate (anotherObject.Property1)'와 같은 무엇인가? –