2011-08-25 5 views
13

저는 Autofac을 사용하여 응용 프로그램의 종속성 삽입을 처리하고 있습니다. 그러나 런타임에 일부 반사 마법을 수행하는 하나의 구성 요소가 있고 컴파일 시간에 필요한 종속성을 알 수 없습니다.서비스 위치 지정자로 Autofac 사용

보통이 구성 요소는 컨테이너를 직접 참조하고 원하는대로 해결합니다. 그러나이 클래스를 인스턴스화하는 클래스에는 컨테이너에 대한 참조가 없습니다.

효과적으로 구성 요소에는 Autofac에 대한 종속성이 있습니다. 느슨한 커플 링을 선호 하겠지만 여기서는 옵션이없는 것 같습니다. 컨테이너에 대한 참조를 내 생성자에게주기 위해 (생성자 args에서, 또는 속성 삽입을 사용하거나, 무엇이든간에) Autofac에 요청하는 방법이 있습니까? 아니면, Autofac에 어떤 것을 해결할 수있는 마법 서비스 로케이터 개체를 제공하는 더 깨끗한 방법이 있습니까?

+2

구성 요소가 어떤 마법을하는지 보는 것은 흥미로울 것입니다. 서비스 검색 패턴 이외의 다른 방법이있을 수 있습니다. 일부 코드로 업데이트 할 수 있습니까? –

+0

나는 그것을 꽤 잘 설명 할 수있다. 메시지가 버스를 통해 들어 오면 코드는 메시지가 어떤 메타 데이터를 사용하는지 유형을 결정한 다음 해당 유형을 구성합니다. 그런 다음 Autofac을 사용하여'IConsume '(여기서'type'은 메타 데이터의 유형 임)의 모든 구현자를 찾은 다음 그 위에 Consume 메소드를 호출해야합니다. –

+0

다음과 같은 의미입니다. http://kozmic.pl/2010/03/11/advanced-castle-windsor-ndash-generic-typed-factories-auto-release-and-more/ –

답변

12

예, 가능합니다. 그냥 IComponentContext에 종속성을 가지고 :

public class MyComponent 
{ 
    IComponentContext _context; 
    public MyComponent(IComponentContext context) 
    { 
     _context = context; 
    } 

    public void DoStuff() 
    { 
     var service = _context.Resolve(...); 
    } 
} 

업데이트 코멘트에서 : MyComponentMyComponent가 해결되었습니다되는 범위에 따라 달라집니다에 IComponentContext 주입. 따라서 어떤 평생 범위 MyComponent이 등록되어 있는지 고려하는 것이 중요합니다. 예 : InstancePerLifetimeScope을 사용하면 컨텍스트는 항상 MyComponent에 종속 된 서비스와 동일한 범위로 해석됩니다. 당신을 가정 할

+0

여러 평생 범위에서 작동합니까? 즉, IComponentContext가 기본 컨테이너 또는 범위일까요? –

+3

'MyComponent'가 해결 된 범위에서'IComponentContext'를 확인합니다. 그래서'MyComponent'가'InstancePerLifetimeScope'으로 등록되면'context'는 항상 예상 범위에서 해결할 것입니다. –

+0

완벽 했어, 내가 필요한 것. –

1

두 가지 구성 요소, A와 B

A는 사용하기 전에 B에 대한 X를 알 필요가있는 경우가,이 메타 데이터 심문이며이 excellent 게시물에 설명되어 있습니다.

또한 디자인을 해당 게시물에 적용 할 수없는 경우에도 DI 컨테이너를 서비스 로케이터로 사용해야하는지 다시 확인해야합니다.

이 글을 올렸을 때 가장 좋은 블로그 게시물은 this입니다.

+0

나는 왜 내 질문과 관련이없는 것들로 이미 잘 대답 된 질문에 대답 할 수 있을지 확신하지 못한다. 내가 말했듯이, 나의 쟁점은 어느 "B"를 해결할 필요가 있는지를 알지 못한다. 런타임까지. –

+1

@NikosBaxevanis +1, 비록 OP가 그것을 얻지 못했지만. 두 게시물 모두 우수합니다.니콜라스 (Nicholas) 지의이 단일 구절은 모든 것을 다시 시작합니다 : "동시에, 컴포넌트에서 IContainer 또는 IComponentContext를 사용할 변명의 여지가 없습니다." – rsenna

0

DI를 사용하여 구성 요소를 만들지 않은 경우에도 서비스 검색 자 패턴을 사용할 수 있습니다. CodePlex에있는 Common Service Locator 라이브러리는이 목적에 완벽합니다.