문제

03Cdiv> Nu003Caside class="s-notice s-notice__info js-post-notice mb16" role="status"> Nu003Cdiv class="grid fd-column fw-nowrap"> Nu003Cdiv class="grid fw-nowrap"> Nu003Cdiv class="grid--cell fl1 lh-lg"> Nu003Cdiv class="grid--cell fl1 lh-lg"> n u003Cb>닫힌u003C/b> . 이 질문은 03Ca href="/help/closed-questions">의견 기반u003C/입니다. 현재 답변을 수락하지 않습니다. n n.u003C/div> Nu003C/div> Nu003C/div> Nu003C/div> Nu003Chr class="my12 outline-none baw0 bb bc-powder-2"> Nu003Cdiv class="grid fw-nowrap fc-black-600"> Nu003Cdiv class="grid--cell mr8"> N u003Csvg class="svg-icon iconLightbulb" aria-hidden="true" width="18" height="18" viewbox="0 0 18 18">u003Cpath d="M15 6.38A6.48 6.48 0 007.78.04h-.02A6.49 6.49 0 002.05 5.6a6.31 6.31 0 002.39 5.75c.49.39.76.93.76 1.5v.24c0 1.07.89 1.9 1.92 1.9h2.75c1.04 0 1.92-.83 1.92-1.9v-.2c0-.6.26-1.15.7-1.48A6.32 6.32 0 0015 6.37zM4.03 5.85A4.49 4.49 0 018 2.02a4.48 4.48 0 015 4.36 4.3 4.3 0 01-1.72 3.44c-.98.74-1.5 1.9-1.5 3.08v.1H7.2v-.14c0-1.23-.6-2.34-1.53-3.07a4.32 4.32 0 01-1.64-3.94zM10 18a1 1 0 000-2H7a1 1 0 100 2h3z">u003C/path>u003C/svg> Nu003C/div> Nu003Cdiv class="grid--cell lh-md"> Nu003Cp class="mb0"> n u003Cb>이 질문을 향상시키고 싶습니까?u003C/b> 질문을 업데이트하므로 사실과 인용으로 답변 할 수 있습니다 3Ca href="/posts/213027/edit">이 게시물 편집u003C/. Nu003C/p> Nu003Cp class="mb0 mt6"> u003Cspan class="relativetime" title=" "2013-10-03." 08:01:46Z">6 년 전에u003C/span> 닫혔습니다.u003C/p> Nu003C/div> Nu003C/div> Nu003Cdiv class="mt24 grid gsx gs8"> n 03Ca class="s-btn s-btn__outlined grid--cell js-post-notice-edit-post" href="/posts/213027/edit"> N이 질문을 개선 nu003C/ N.u003C/div> Nu003C/aside> n n.u003C/di

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
  1. 03Cli> 기본 생성자가있는 유형으로 스스로를 제한합니다. 생성자에서 일부 구성을 사용하는 유형을 사용하려면 어떻게해야합니까?u003C/l
  2. i> Nu0
  3. 03Cli> 종속성이있는 종속성이있는 종속성이있는 경우 Node<Foo<Bar<Baz>>>와 같은 끔찍한 유형으로 끝납니다. 특히 유형의 구성원 중 어느 것도 실제로 유형 매개 변수에 의존하지 않기 때문에 많은 의미가 없습니다.u003C/l
  4. i> Nu0
  5. 03Cli> 컴파일 시간에 구체적인 종속성 유형을 지정해야합니다. 이렇게하면 코드가 훨씬 덜 유연하게 만들어졌으며 예를 들어 구성 파일을 편집하여 종속성을 전환 할 수는 없습니다 (유용 할 수 있음).u003C/l
  6. i> Nu0
  7. 03Cli> new Node<Foo>()new Node(new Foo())보다 나은 방법은 무엇입니까?u003C/l
  8. i> Nu003C/o
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 softwareengineering.stackexchange
scroll top