문제

나는 생각을 사용하여 Microsoft 통일에 대한 내성 주입구에서 우리의 사용자 인터페이스가 있습니다.

우리의 중간 계층 이미 사용하고 성 윈저,하지만 나는 생각을 내가 지켜야 한다는 Microsoft.

누군가에 대해 어떤 생각을 가지고 무엇을 최고의 종속성을 주입 도구입니까?

도움이 되었습니까?

해결책

시스템을 IOC/DI를 염두에두고 설계 한 경우 하나의 컨테이너를 고수하는 것이 중요하지 않습니다. 적절한 접근 방식으로 IOC 라이브러리를 쉽게 변경할 수 있습니다.

물론 컨테이너는 널리 사용되는 일반적인 시나리오 (라이프 사이클 관리, 적절한 컨테이너 중첩, XML 및 코드 구성, 차단, 빠른 해상도)를 지원할 수있는 충분한 유연성을 제공해야합니다.

Castle (널리 사용되고 통합 라이브러리가 많이 있음)과 Autofac (가벼운, 빠르고 적절한 컨테이너 중첩이 있지만 널리 사용되지는 않음) 사이를 선택하는 것이 좋습니다.

이있다 IOC 컨테이너의 포괄적 인 목록 Hanselman

추신 : Unity를 사용하고 싶지 않습니다

다른 팁

최근 에이 중 6 개 사용을 스파이크했습니다.윈저, 단일성, Spring.net, Autofac, 새끼, 구조 맵) 각각의 선택 기준 및 최종 선택에 대한 빠른 요약을 제공 할 수 있습니다.

참고 : 우리 팀 중 하나가 .NET 포트가 Java 버전에서 상당히 열악하다고 생각하기 때문에 PicoContainer.net을 보지 않았습니다. ObjectBuilder2 위에 Unity가 구축되었으며 기본적으로 우수한 선택으로 간주되었으므로 ObjectBuilder를 보지 않았습니다.

첫째, 나는 그들 모두가 모두 매우 비슷하다고 말할 수 있으며, 그것은 실제로 당신에게 가장 적합한 것과 특정 요구 사항에 달려 있습니다. 우리의 요구 사항은 다음과 같습니다.

요구 사항

  • 생성자 기반 주입 (우리는 의도합니다 ~ 아니다 속성, 필드 또는 방법 주입을 사용하려면)
  • 프로그래밍 가능한 구성 (~ 아니다 XML)
  • 컨테이너 계층 (응용 프로그램 당 하나, 요청 당 및 세션 당 구성 요소 수명 범위를 컨테이너에보다 암시 적으로 바인딩하기 위해)
  • 구성 요소 수명 관리 (보다 세분화 된 범위를 위해 과도 / 싱글 톤)
  • 인터페이스에서 유형 또는 콘크리트 인스턴스로의 주입 (예 : ILogger -> typeof(FileLogger) 또는 ILogger -> new FileLogger() )
  • 사전 / 사후 초기화를위한 고급 구성 요소 생성 / "Creaton Event Mechanism"
  • 올바른 처분 IDisposable 컨테이너의 구성 요소는 중단됩니다
  • 잘 문서화 및/또는 온라인 정보를 쉽게 이용할 수 있습니다

    참고 : 성능은 요구 사항 이었지만 검토 된 모든 컨테이너가 이것에 따라 비슷한 것처럼 보였기 때문에 선택에 고려되지 않았습니다. 기준

테스트

각 컨테이너는 일반적인 ASP.NET WebForms 프로젝트에 사용되었습니다 (대상 응용 프로그램 유형이므로). 우리는 단일 간단한 사용자 컨트롤과 함께 단일 간단한 페이지를 사용했으며 각각 기본 페이지 / 기본 제어에서 각각 상속을 받았습니다. 우리는 1 개의 컨테이너를 사용했습니다 BasePage "요청 당"범위 컨테이너 및 Global.asax의 "응용 프로그램"범위의 경우 1의 경우 두 컨테이너에서 종속성을 해결할 수 있도록 함께 체인하려고 시도했습니다.

각 웹 애플리케이션은 다단계 의존성, 스코프 유형 (싱글 톤/과도) 및 관리 및 관리되지 않는 클래스를 시뮬레이션하는 도메인 개체 세트를 공유했습니다.IDisposable 필수의). "최상위"종속성 구성 요소는 BasePage.

결과

Windsor- 모든 기준을 충족했으며 좋은 사례 기록, 블로거 커뮤니티 및 온라인 문서가 있습니다. 사용하기 쉽고 아마도 Defacto 선택 일 것입니다. 공장 시설을 통한 고급 구성 요소 생성. 또한 개별적으로 생성 된 컨테이너의 체인을 허용했습니다.

Spring.net- 장방적이고 도움이되지 않는 문서화 및 프로그래밍 가능한 구성을위한 불쾌한 / 쉬운. 제네릭을 지원하지 않았습니다. 선택되지 않았습니다

Ninject- 좋은 명확한 문서와 함께 사용하기 쉽습니다. 컨테이너 계층 구조를 제외한 모든 요구 사항을 충족하는 강력한 기능 세트는 불행히도 선택되지 않았습니다.

StructureMap- 문서화가 잘못되었지만 모든 요구 사항을 충족하는 고급 기능 세트가 있었지만 컨테이너 계층에 대한 내장 메커니즘은 없었지만 루프를 위해 함께 해킹 할 수는 없었습니다. 여기 Lambda Expression Fluent 인터페이스는 처음에는 약간 복잡해 보였지만 캡슐화 될 수있었습니다.

Unity- 잘 문서화되고 사용하기 쉽고 모든 선택 기준을 충족하며 필요한 확장 메커니즘이있어 필요한 전/사후 제작 이벤트 메커니즘을 추가 할 수 있습니다. 아동 용기는 모 컨테이너에서 만들어야했습니다.

Autofac- Lambda Expression 구성은 약간 복잡해 보이지만 잘 문서화되고 상대적으로 사용하기 쉽습니다. 그러나 다시 쉽게 캡슐화 할 수 있습니다. 구성 요소 스코핑은 "태깅"메커니즘을 통해 달성되며 모든 구성 요소는 약간 불편한 건축업자를 사용하여 전면으로 구성됩니다. 자식 용기는 부모로부터 생성되었으며 "태그"에서 구성 요소를 할당했습니다. 허용 된 일반 주입.

결론

우리의 최종 선택은 윈저와 통일 사이였으며, 이번에는 사용 편의성, 문서화, 확장 시스템 및 "생산"상태로 인해 통일성을 선택했습니다.

다음은 .NET IOC 컨테이너를 비교하는 좋은 기사입니다.http://blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part--1/

나는 사용을 시작했다 Autofac 1 년 전과 그 이후로 뒤돌아 보지 않았습니다.

저는 자동 팬이지만 Windsor와 Unity는 모두 좋은 일을 할 것입니다 (Windsor는 Unity보다 능력이 높고 코드를 기반으로 할 필요는 없습니다). 그래도 시스템에서 단일 컨테이너를 고수하는 데 많은 기술적 인 이유가 많이 있습니다.

무엇을 사용을 작동합니다.대부분의 기능을 가지고 있는 그들에게 독특하고,거의 모든 더 많은 기능이 풍부한다 Unity.는 경우 유니티입니다 당신이 필요로하는 모든,당신은 확실히 그것을 사용합니다.

를 사용하여 Microsoft 의 화합의 마이크로소프트에서 가난한 방법으로 결정을 내릴 수 있습니다.는 것에 대해 생각하고 필요한 이유,그리고 적합한 것을 선택합니다.

그러나 저는 두 번째의 개념을 고집하여 하나의 컨테이너의 가능한 경우.

나는 그것을 사용하고있다 관리 확장 성 프레임 워크 작업하기가 매우 쉽다는 것을 알았습니다. 그랬어요 .NET 4에 통합.

가능한 IOC 컨테이너 솔루션 중 하나가 활용 한 특정 하위 기술에 대한 경험과 개인 선호도가 없다면 모두 잘 작동하며 특히 눈에 띄는 "킬러 기능"을 가진 사람을 보지 못합니다. 다른 사람들로부터. Unity는 아마도 P & P Enterprise Library 4.x를 사용하는 솔루션에 가장 적합 할 것입니다.

IOC 컨테이너 벤치 마크 - 성능 비교 20 개 이상의 제품에 대한 성능 및 기능 비교 테이블을 보유하고 있으며 최신 상태로 유지합니다.

기사의 결론 :

SimpleInjector, Hiro, FunQ, Munq 및 Dynamo는 최고의 성능을 제공하며 매우 빠릅니다. 그들에게 시도해보세요!

특히 간단한 인젝터 좋은 선택 인 것 같습니다. 매우 빠르며 좋은 문서를 가지고 있으며 인터 셉션 및 제네릭 데코레이터와 같은 고급 시나리오도 지원합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top