3

저는 1 년 넘게 StructureMap을 사용해 왔습니다. 그리고 내가 사용하는 모든 시간 나는이IoC 용 래퍼가 좋은 생각입니까?

class IoC { 
    public static T GetInstance<T>() 
    { 
     return (T)GetInstance(typeof(T)); 
    } 
    public static IEnumerable<T> GetAllInstances<T>() 
    { 
     return ObjectFactory.GetAllInstances<T>(); 
    } 

    public static IEnumerable GetAllInstances(Type type) 
    { 
     return ObjectFactory.GetAllInstances(type); 
    } 

    public static object GetInstance(Type type) 
    { 
     return ObjectFactory.GetInstance(type); 
    } 

    public static void Inject<T>(T obj) 
    { 
     ObjectFactory.Inject(obj); 
    } 
} 

처럼 보였다 내가 선까지 점에서 IoC 컨테이너를 변경할 수 있습니다 가정 래퍼를 추가 IOC의라는 래퍼 클래스를 가지고있다. 이 시점에서 나는 이것이 나쁘다고 생각하고 있습니다. 한 가지 이유는 : 코드에서 다른 흥미로운 일을하기 위해 ObjectFactory를 사용할 수 없다는 것입니다.이 래퍼를 사용해야합니다. 다른 하나는 : 우리 코드가 실제로 DependencyInjection 컨테이너와 독립적 일 필요는 없습니다.

이 접근법을 사용하는 데있어서 장점/단점은 무엇입니까?

+0

[Mark Seemann] (http://blog.ploeh.dk/)은 이러한 래퍼를 'Conforming Container'라고 부릅니다. 그는 최근에 [이것에 대한 블로그 게시물] (http : //blog.ploeh.dk/2014/05/19/conforming-container /) 그는 이것을 명백히 반 패턴이라고 부른다. – Steven

답변

6

이 이유 때문에 Common Service Locator 프로젝트가 개발되었습니다. DI 프레임 워크에 대한 추상화이며 사용자의 IoC 클래스와 같은 인터페이스를 정의합니다. 심지어는 Simple Service Locator 라이브러리를 개발했습니다. 공통 서비스 로케이터 (Common Service Locator) 인터페이스의 직접 구현 인 DI 라이브러리.

그런 의미에서 DI 프레임 워크에 대한 추상화는 이상하지 않습니다. 그러나 Dependency Injection을 올바로 (그리고 완전히) 수행 할 때, 응용 프로그램의 디자인을 적절하게 조정하고, 응용 프로그램 루트에 컨테이너를 구성하고, 유형이 어셈블 된 응용 프로그램에서 단일 위치를 선호하는 것이 좋습니다 (read : were GetInstance이 호출 됨). ASP.NET MVC 응용 프로그램의 경우 ControllerFactory이됩니다. ASP.NET WebForms 응용 프로그램의 경우 일반적으로 PageHandlerFactory을 재정의해야합니다.

이러한 규칙에 따라 게임을 할 때 어쨌든 응용 프로그램의 단일 위치에서 컨테이너를 호출하기 때문에 이러한 추상화를 사용할 이유가 없습니다. 그러나 이것이 실현 가능하지 않다면 Common Service Locator 또는 자신의 추상화를 사용하는 것이 좋습니다.

그러나 많은 문제가 발생하고 일반적으로 is seen as an anti-pattern이 발생하기 때문에 코드가 IoC 라이브러리의 추상화에 의존하도록하기 전에 한 걸음 뒤로 물러서십시오. 코드에서 컨테이너로 다시 전화 걸기 :

  • 코드를 테스트하기가 훨씬 더 어렵습니다.
  • 대신 종속성을 숨기고 코드를 읽고 유지하기 어렵게 만듭니다.
  • 컴파일 타임 지원을 사용하지 않습니다.
  • 종속성 그래프를 도구로 확인할 수 없도록합니다.
+0

외부 종속성 주위에 래퍼를 사용하는 것이 좋습니다. 그러나 사람들이 IoC 컨테이너를 전환하는 실제 인스턴스가 있는지 여부는 알 수 없습니다. –

1

IOC 용기를 통하게 교환 할 수 있다는 점이 다릅니다. IOC 컨테이너와 관련된 기능을 모두 잃어 버리는 경우가 있습니다. MVC 터빈은이 방법을 사용합니다. 로케이터를 처리하는 방법을 확인하려면 소스를 살펴보십시오. http://mvcturbine.codeplex.com/

1

라이브러리가 많고 해당 라이브러리 위에 많은 응용 프로그램이 구축되면 많은 응용 프로그램에서 중복되는 많은 IoC 등록 코드가 생성됩니다.

각 라이브러리는 컨테이너에 등록해야하지만 특정 IoC 구현에 대해 알고 있어야합니다. 또는 IoC 랩퍼를 제안하고 작성하면서 라이브러리를 작성하여 IoC 랩퍼를 통해 등록 할 수 있습니다.

관련 문제