2009-12-08 2 views
0

IOC 컨테이너에 대한 인터페이스 래퍼를 만들려고하므로 특정 컨테이너에 대한 종속성이 필요하지 않습니다. 내 문제는 문자열 중 하나 인 companyID를 사용하는 일부 서비스 클래스입니다.래퍼를 만들 때의 IOC 컨테이너 및 프리미티브

T Resolve<T>()과 같이 일반적인 인터페이스 방법을 만들고 싶습니다. 여기서 T는 서비스 인터페이스입니다.

ObjectFactory.With("companyid").EqualTo("someCompanyID").GetInstance<ICompanyService>();

내가 인터페이스 방식의 호출 이런 종류의 포장 :

은 지금은 콘크리트 생성자가 회사 ID에 걸리는 경우 그래서 같은 것을 할 것입니다 뒤에서 StructureMap를 사용하고 알고 : ICompanyService GetCompanyService(string companyID)

내가 지금 가지고있는 방식은 응용 프로그램이 StructureMaps 구성을 초기화하고 서비스를 전달하는 구체적인 클래스가 생성자에 대해 많은 것을 알고 있어야합니다. 나는 그 일이 일어나지 않도록하고 포장지를 일반적인 것으로 만들고 싶습니다. 인터페이스의 각 메소드에 companyID을 추가하지 않고도 좋은 방법이 있습니까?

답변

2

개인적으로 MSUnity (My IOC container of choice)를 추상화하는 것에 대해 개인적으로 신경 쓰지 않습니다. 나에게 그것은 너무 먼 한 걸음이다. 구조 맵 특정 기능을 사용하는 것처럼 들리므로 추상화가 더 어려워집니다.

당신은 CommonServiceLocator project을 알고 있습니까? 그 주요 방법은 두 가지 방법을 가지고 :

protected override object DoGetInstance(Type serviceType, string key) { } 
protected override IEnumerable<object> DoGetAllInstances(Type serviceType) {} 

당신은 쉽게 전환 할 수 있습니다. 여기에 some more info이 있습니다.

+0

나는 SM을 조금 뽑아 냈다. 나는 래퍼 (wrapper)를 만든 일부 오픈 소스를보고 있지만, ctors의 프리미티브를 고려하지는 않는다. – CSharpAtl

+0

@ CSharpAtl- 디자인을 재고하십시오. 이와 같은 프레임 워크는 가장 낮은 공통 분모와 함께 작동해야합니다. StructureMap 특정 기능을 사용할 수있는 것보다 IOC를 전환 할 수 있는지 여부를 결정해야합니다. – RichardOD

+0

@RichardOD 동의합니다. – pattersonc

0

MvcContrib에는 DependencyResolver 클래스가 있습니다.

반면에 대부분의 경우 앱 프로젝트에서만 IoC 컨테이너를 참조했습니다. 예를 들어, 간단히 ctor 삽입을위한 클래스를 설정하고 인스턴스 (앱 프로젝트에서)를 가져와야 할 때 IoC 컨테이너에 요청합니다. IoC 컨테이너는 ctor 인수를 채우는 것에 대해 걱정할 수 있지만 객체는 IoC 컨테이너를 인식하지 못합니다. 이 방법은 내 앱 프로젝트가 IoC 컨테이너를 참조해야하는 유일한 프로젝트입니다.

관련 문제