라는 인터페이스가 IContext
있습니다. 이를 위해 다음을 제외하고는 실제로 어떤 일을하는지는 중요하지 않습니다.
T GetService<T>();
이 방법은 응용 프로그램의 현재 DI 컨테이너를보고 종속성을 해결하려고 시도합니다. 상당히 표준이라고 생각합니다.
내 ASP.NET MVC 응용 프로그램에서 생성자는 다음과 같습니다.
protected MyControllerBase(IContext ctx)
{
TheContext = ctx;
SomeService = ctx.GetService<ISomeService>();
AnotherService = ctx.GetService<IAnotherService>();
}
따라서 각 서비스의 생성자에 여러 매개 변수를 추가하는 대신 (응용 프로그램을 확장하는 개발자에게는 실제로 성 가시고 시간이 많이 걸리기 때문에)이 방법을 사용하여 서비스를 받고 있습니다.
지금, 그것은 잘못 느낀다 . 그러나, 내가 현재 내 머릿속에서 그것을 정당화하는 방법은 이것 입니다. 나는 그것을 조롱 할 수 있습니다 .
저 할 수 있어요. IContext
컨트롤러를 테스트 하기 위해 조롱하는 것은 어렵지 않습니다 . 어쨌든 나는 :
public class MyMockContext : IContext
{
public T GetService<T>()
{
if (typeof(T) == typeof(ISomeService))
{
// return another mock, or concrete etc etc
}
// etc etc
}
}
그러나 내가 말했듯이, 그것은 잘못 느낍니다. 모든 생각 / 학대 환영.
public SomeClass(Context c)
. 이 코드는 분명하지 않습니까? 에 that SomeClass
따라 다릅니다 Context
. 어르지만 기다리지 마라! X
컨텍스트에서 얻는 종속성에만 의존합니다 . 즉, 때마다 당신을 변경하기 Context
가 있었다 휴식 SomeObject
만 변경하더라도 Context
들 Y
. 하지만 그래, 당신은 당신 만 변경 알고 Y
있지 X
때문에, SomeClass
괜찮습니다. 그러나 좋은 코드를 작성하는 것은 사용자 가 아는 것이 아니라 새로운 직원이 코드를 처음 볼 때 아는 것입니다.