2010-01-08 6 views
2

현재 Autofac을 사용하고 있지만 다른 IOC 컨테이너에 관한 논평은 열려 있습니다. 가능하다면 Autofac을 사용하는 솔루션을 선호합니다. 나는 또한 IOC에 다소 익숙하기 때문에 IOC 컨테이너를 사용해야하는 것을 오해 할 수도있다. 다음과 같이IOC/Autofac 컨테이너

기본적으로 상황은 다음과 같습니다

가 내 앱의 최상위 IOC 컨테이너를 가지고있다. 나는 자식 컨테이너/스코프의 트리를 가지는데, 트리에서 어떤 레벨로 해결되는지에 따라 다르게 해결할 동일한 "서비스"(IWhatever)를 원합니다. 게다가 서비스가 트리의 어느 레벨에 등록되어 있지 않은 경우, 적절한 구현이 발견 될 때까지 트리를 위쪽으로 횡단하고 싶습니다.

또한 주어진 구성 요소를 구성 할 때 상위 컨테이너/범위에 대한 액세스가 필요할 수도 있습니다. 대부분의 경우 등록중인 구성 요소에는 상위 범위의 동일하거나 다른 서비스에 대한 종속성이 있습니다.

이 종속성을 Autofac으로 표현할 수있는 방법이 있습니까? 나는 여러 가지 이유로 일을 위의 의사 코드와 유사한 아무것도 얻을 수 없다

builder.Register(c=> 
{ 
    var parentComponent = ?.Resolve<ISomeService>(); 
    var childComponent = new ConcreteService(parentComponent, args...); 
    return childComponent; 
}).As<ISomeService>(); 

:처럼 뭔가

A) 보인다 등록의 범위 트리 주에있는 모든 수준의 공통가. 주어진 등록이 특정 "범위"에 국한되도록하는 방법을 찾지 못하는 것 같습니다.

B) 주어진 범위의 부모 범위를 유지할 수있는 방법을 찾지 못하는 것 같습니다. 컨테이너에서 ILifetimeScope을 해결 한 다음 부모 범위를 제공하는 구체적인 LifetimeScope 인스턴스에 케이스를 적용 할 수 있습니다.하지만이 방법을 사용하는 것이 좋습니다. 이거 안전한가요?

C) 어떻게 컨테이너가 해결 된 객체를 소유하고 있는지 Autofac에 알리는 방법을 모르겠습니다. 많은 구성 요소에 대해 구성 요소가 구성되는 범위에서 구성 요소를 "소유"하고 싶습니다. 태그가 추가 된 컨텍스트가 여기에 도움이 될 수 있습니까? 고유 한 태그로 트리의 모든 레벨을 태그해야합니까? 트리 깊이가 런타임에 결정되기 때문에 이것은 어려울 것입니다.

매우 긴 질문에 사과드립니다. 요약하면 :

1) 내가 Autofac을 사용하여 원하는 것을 할 수있는 방법이 있습니까?

2) 이러한 종류의 종속성 구조에 더 적합한 다른 컨테이너가 있습니까?

3) IOC가 잘못된 도구입니까?

답변

2

Autofac 1.4는 이것을 쉽게 지원하며 아마도 지금 여기에서 최선의 선택 일 것입니다. 하위 컨테이너에 하위 컨테이너 구성 요소를 등록하기 만하면됩니다.

사용중인 Autofac 2는 아직 조사 중이지만 간단한 설명이 없습니다.

+0

우수. 도움을 주셔서 감사합니다 - 1.4로 회귀해야 할 것 같은데요 (현재). 그냥 호기심에서 왜이 행동을 제거합니까? 평범한 범위가 공통 등록을 공유하는 AutoFac 2 수명 범위 모델에서보다 일반적인 유스 케이스가 더 잘 지원됩니까? 아니면 autofac 2가 아직 불완전하기 때문입니다. 어쨌든 - 도움 주셔서 대단히 감사합니다! – Krazzy

+0

당신을 진심으로 환영합니다. Autofac 2는 결국 이것을 지원해야하지만 모델이 다르므로 구현에 약간의 고려가 필요합니다.모델을 변경하면 컨테이너 조작이 필요한 이와 같은 작업에 '어댑터'를 훨씬 쉽게 추가 할 수 있습니다. 모두 제일 좋다! –