-
30-09-2020 - |
문제
03Cp> "Service Locator"패턴 단점 중 하나는 호출자 03Ca href="http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/" rel="nofollow noreferrer">칼레의 의존성에 대해 오도 할 수 있습니다.u003C/입니다.u003C/
03Cp> OK,하지만 종속성을 클래스 수준에서 일반 매개 변수로 전환하면 어떨까요?u003C/
class Node<T> where T : ISomeInterface, new()
{
ISomeInterface obj
public Node()
{
obj = new T();
}
}
03Cp> 나는 몇 가지 의견을 발견했지만, 나는 계속해서 토론을 원한다.u003C/
03Cp> 가장 중요한 카운터 쟁이는 제네릭을 사용하여 종속성을 주입하는 것은 늦은 바인딩을 사용할 수 없게된다는 것입니다. 그러나 누가 대부분의 경우에 관심이 있습니까? 내 앱 이이 기능을 필요로하지 않으면 어떻게해야합니까?u003C/
03Cp> 나는 단단한 침대를 찾고 싶다.u003C/
03Cp> PS new () 제약 조건은 필요하지 않습니다.u003C/
해결책
03Cp> 연결된 기사는 내 의견으로는 약간 오해가있는 것입니다. 예, 컨트롤 컨테이너의 반전을 사용하면 컴파일 된 시간보다는 런타임에 일부 오류가 나타납니다. 일반적으로 코드를 더 깨지기 쉽고 유지하는 과정을 만듭니다. 이는 서비스 로케이터에 적용되거나 실제로 다른 IOC 컨테이너가 내 경험에 적용됩니다. 이것은 그들을 방지 패턴으로 만들지 않습니다.u003C/
03Cp> 핵심 사항은 해당 플러그인 동작 u003Cstrong>이 필요하지 않으면 사용하지 마십시오u003C/strong> . 모든 설계 결정은 무역이 없으며, IOC의 경우에는 늦은 바인딩 (및 테스트의 용이성)은 컴파일 시간 (그리고 가독성 / 디버그 능력이 감소)이 아닌 런타임 오류가 발생하는 것입니다.u003C/
03Cp> 실제로 기본 접근 방식은 생성자에서 매개 변수를 취하는 일반 오래된 객체를 만드는 것입니다. 일단 그것이 충분하지 u003Cem>않으면u003C/em> 멋진 트릭에 대해 걱정할 것을 시작하십시오.u003C/
다른 팁
03Cp> 나는 당신의 해결책이 실제로 원래보다 더 나쁘다고 말할 것입니다.u003C/
- 03Col> Nu0
- 03Cli> 기본 생성자가있는 유형으로 스스로를 제한합니다. 생성자에서 일부 구성을 사용하는 유형을 사용하려면 어떻게해야합니까?u003C/l i> Nu0
- 03Cli> 종속성이있는 종속성이있는 종속성이있는 경우
Node<Foo<Bar<Baz>>>
와 같은 끔찍한 유형으로 끝납니다. 특히 유형의 구성원 중 어느 것도 실제로 유형 매개 변수에 의존하지 않기 때문에 많은 의미가 없습니다.u003C/l i> Nu0 - 03Cli> 컴파일 시간에 구체적인 종속성 유형을 지정해야합니다. 이렇게하면 코드가 훨씬 덜 유연하게 만들어졌으며 예를 들어 구성 파일을 편집하여 종속성을 전환 할 수는 없습니다 (유용 할 수 있음).u003C/l i> Nu0
- 03Cli>
new Node<Foo>()
는new Node(new Foo())
보다 나은 방법은 무엇입니까?u003C/l i> Nu003C/o