2010-06-10 6 views
2

IoC, MEF [Imports] 또는 다른 DI 솔루션을 사용하여 컴포지션 시간 대신 오브젝트 작성시 신속하게 종속성을 작성하는 방법이 있습니까?IoC - 오브젝트 인스턴스의 동적 구성

내 생각은 다음과 같습니다. 이벤트를 발생시키는 개체의 인스턴스가 있지만 개체를 ​​한 번만 만들고 메모리에 저장하는 경우 개체를 만들 때마다 이벤트 처리기를 등록해야합니다. 내가 알 수있는 한, 대부분의 IoC 컨테이너는 composition에 사용 된 모든 클래스를 등록하고 Compose()를 호출하여 모든 종속성을 연결하도록 요구한다.

나는 이것이 객체 생성, 의존성 주입 등의 오버 헤드로 인해 이렇게하기 위해 끔찍한 디자인 (나는 레거시 시스템을 다루고있다)일지도 모른다라고 생각한다. 그러나 그것이 하나 일 가능성이 있는지 궁금해하고 있었다. 긴급한 IoC 기술의

어쩌면 몇 가지 용어가 섞여 있지만 내 목표는 객체의 인스턴스에 "모든 이벤트를 연결"하는 프레임 워크를 작성하지 말고 MEF 같은 것을 [내보내기] 핸들러 (종속성)에 사용하는 것입니다. 아주 특정 인터페이스와 [ImportMany]를 객체 인스턴스에 적용하여 응용 프로그램이 시작될 때 어셈블리가 있으면 내 내보내기가 호출됩니다. 그래서 어플 리케이션이 시작될 때 모든 오브젝트가 여전히 구성 될 수 있지만, 오브젝트가 작성되고 소멸 될 때 시스템이 모든 오브젝트를 찾고 호출하기를 원합니다.

답변

4

일반적으로 DI/IoC 환경에서 직접 인스턴스화를 처리하는 방법은 추상 팩터 리를 사용하는 것입니다. 팩토리는 유형의 컨테이너로, 새 오브젝트를 인스턴스화 할 때 종속성을 해결하기 위해 컨테이너와 직접 상호 작용할 수 있습니다.

public interface IWidgetFactory 
{ 
    IWidget CreateWidget(...); 
} 

public class MyIocWidgetFactory : IWidgetFactory 
{ 
    private IoCContainer container; 

    public MyIocWidgetFactory(IoCContainer container) 
    { 
     if (container == null) 
      throw new ArgumentNullException("container"); 
     this.container = container; 
    } 

    public IWidget CreateWidget(...) 
    { 
     // Assumes that the container is configured to create transient objects 
     // for IWidget, not a singleton. 
     return container.Resolve<IWidget>(); 
    } 
} 

서비스 탐지기 패턴과 혼동하지 마십시오. 그 밖의 다른 것은 컨테이너가 아니라 단지 공장을 만지는 것이 허용되며 한 유형의 객체 만 생성합니다.

IWidgetFactory은 런타임에 위젯을 만드는 데 필요한 모든 항목을 전달합니다. DI가 유지되었습니다.

+0

일부 DI 컨테이너는 생성 팩토리도 지원합니다. 예를 들어 Func -delegate를 주입 할 수 있습니다. 그런 다음 DI 컨테이너는 IWidget 인스턴스에 대한 팩토리를 생성합니다. 예 : Autofac : http://nblumhardt.com/2010/01/the-relationship-zoo/ – Gamlor

+0

궁금한 점이 있으시면이 팩토리를 첫 번째 개체를 만들고자하는 클래스에 삽입해야할까요? 장소? 아니면 이것을 인스턴스화해야합니까? – stuartmclark

+1

@stuartmclark : 공장에 주입했습니다. 이것이 IWidgetFactory이고 구체적인 유형이 아닌 이유입니다. 여러 IoC 컨테이너가 실제로 자동으로 팩토리를 생성 할 수 있기 때문에 위의 유형조차 필요하지 않습니다. 단지 'Func '또는 'Lazy '만 삽입하면됩니다. – Aaronaught