2009-06-29 2 views
4

내가 선택한 IoC 컨테이너 라이브러리에서 모든 코드를 분리하려고합니다 (Unity). 이를 위해 Register() 및 Resolve()를 노출하는 IContainer 인터페이스를 만들었습니다. IContainer를 구현하고 실제 컨테이너를 래핑하는 UnityContainerAdapter라는 클래스를 만들었습니다. UnityContainerAdapter가 정의 된 어셈블리 만 Unity 라이브러리에 대해 알고 있습니다.실제 IoC 컨테이너 라이브러리를 숨기는 방법은 무엇입니까?

나는 고립되어 있다고 생각합니다. Unity는 유형의 구성원에 대한 속성을 검색하여 종속성을 주입 할 위치를 확인합니다. 내가 본 대부분의 IoC 라이브러리도이를 지원합니다. 내가 가지고있는 문제는 그 기능을 사용하고 싶지만 클래스가 Unity 특정 속성에 의존하는 것을 원하지 않는다는 것입니다.

이 문제를 해결하는 방법에 대한 제안 사항이 있으십니까?

이상적으로 필자는 자신의 [Dependency] 특성을 만들어 내 코드에서 사용합니다. 하지만 실제 컨테이너에 자체 속성 대신 내 속성을 검색하도록 알려줘야합니다. Common Service Locator 프로젝트 밖으로

+0

다른 IoC 프레임 워크를 사용하여 IoC 프레임 워크를 주입 할 수 있도록 선택 했습니까? 내 머리 아파! –

+0

@ David M : 나는 외부 라이브러리에 대한 의존성을 줄이는 것을 좋아한다. 모든 IoC 라이브러리는 종이에서 동일하게 보이므로 실제로 시도하지 않고 하나를 선택하는 것은 어렵습니다. 나는 Unity와 함께 큰 한계를 발견 할 것입니다. 라이브러리에서 다른 코드를 분리하면 필요할 경우 쉽게 변경할 수 있습니다. – Sylvain

답변

3

답변을 찾았습니다 : Unity는 확장 기능을 사용하여 "선택기 정책"이라고하는 구성을 구성합니다. Unity가 사용하는 속성을 대체하려면 UnityDefaultStrategiesExtension 클래스의 자체 버전을 코딩하고 자신의 속성을 사용하는 자신 만의 "선택기 정책"을 등록하십시오.

자세한 방법은 Unity 코드 플렉스 사이트의 this post을 참조하십시오.

다른 IoC 라이브러리로 전환해도 동일한 작업을 쉽게 수행 할 수 있을지 확신 할 수 없지만 문제가 해결되었습니다.

4

점검 :

공통 서비스 로케이터 라이브러리 는 응용 프로그램과 프레임 워크 개발자가 참조 할 수 서비스 위치에 대한 공유 인터페이스가 포함되어 있습니다. 라이브러리는 IoC 컨테이너와 서비스 로케이터에서 추상화 을 제공합니다. 라이브러리를 사용하면 참조에 의존하지 않고 응용 프로그램이 기능에 간접적으로 액세스 할 수 있습니다. 이 라이브러리를 사용하여 라이브러리를 사용하면 및 프레임 워크가 자신을 구현으로 묶지 않고 IoC/서비스 위치를 활용할 수 있습니다.


편집 : 이것은 의존성 주입의 속성에 기반 선언을 사용하는 당신의 욕망을 해결하기 위해 표시되지 않습니다. 사용하지 않거나 언급 한 것처럼 여러 주입 라이브러리에 특성을 추상화하는 방법을 찾을 수 있습니다.

선언적 인터페이스의 기본 문제는 특정 구현과 관련되어 있습니다.

개인적으로 나는이 문제에 부딪치지 않기 위해 개인적으로 생성자 삽입을 고수합니다.

+0

링크를 제공해 주셔서 감사합니다. 굉장히 유용하다. 그것들은 그 라이브러리에있는 속성들에 대한 의존성들을 선언하는 데 사용할 속성을 추가 할 수도 있습니다. 나는 그 프로젝트를 계속 지켜 볼 것이다. 나는 작성 프로세스를 제어하지 않는 유형이 있기 때문에 등록 정보에 injection을 사용하려고합니다. 다른 라이브러리가 인스턴스를 생성하고 전달합니다. 나는 그 인스턴스에서 IContainer.InjectDependencies (객체 목표)를 호출 할 계획이다. – Sylvain

0

xml의 속성없이 구성을 설정하지 않았습니까? 그건 좀 더 "불분명하다"는 것을 개인적으로 나는 XML과 속성의 조합을 사용하지만, 적어도 하나의 것에 대한 의존성을 "해결"한다.

관련 문제