문제

나는 의존성 주입을 위해 Microsoft의 통일성을 사용하고 있으며 다음과 같은 일을하고 싶습니다.

IDataContext context = _unityContainer.Resolve<IDataContext>();
var repositoryA = _unityContainer.Resolve<IRepositoryA>(context); //Same instance of context
var repositoryB = _unityContainer.Resolve<IRepositoryB>(context); //Same instance of context

IDataContext context2 = _unityContainer.Resolve<IDataContext>(); //New instance
var repositoryA2 = _unityContainer.Resolve<IRepositoryA>(context2);

RepositoryA 그리고 RepositoryB 둘 다에 걸리는 생성자가 있습니다 IDataContext 매개 변수와 나는 유니티가 저장소를 전달하는 컨텍스트로 초기화하기를 원합니다. 또한 주목하십시오 IDataContext Unity에 등록되지 않았습니다 (3 인스턴스를 원하지 않습니다. IDataContext).

도움이 되었습니까?

해결책

오늘부터 그들은이 기능을 추가했습니다.

여기에는 최근 드롭에 있습니다.

http://unity.codeplex.com/sourcecontrol/changeset/view/33899

여기에 대한 토론 :

http://unity.codeplex.com/thread/view.aspx?threadid=66434

예시:

container.Resolve<IFoo>(new ParameterOverrides<Foo> { { "name", "bar" }, { "address", 42 } });"

다른 팁

<2 센트>

나중에 컨텍스트보다 다수가 필요한 다른 서비스를 사용하기로 결정하면 어떻게됩니까?

생성자 매개 변수 및 IOC의 문제점은 서비스 인터페이스가 정의하는 계약의 일부와 반대로 매개 변수가 궁극적으로 사용되는 콘크리트 유형과 연결되어 있다는 것입니다.

내 제안은 당신이 컨텍스트를 해결하고, 나는 Unity가 3 가지 인스턴스를 구성하지 않는 방법이 있어야한다고 생각합니다. 그렇지 않으면 객체를 구성 할 수있는 공장 서비스를 고려해야합니다.

예를 들어, 나중에 기존 데이터베이스에 전혀 의존하지 않는 저장소를 구성하기로 결정한 경우 XML 파일을 사용하여 테스트를 위해 더미 데이터를 생성하는 방법은 무엇입니까? XML 컨텐츠를 해당 생성자에게 공급하는 방법은 무엇입니까?

IOC는 디퍼 커플 링 코드를 기반으로합니다. 콘크리트 유형에 인수의 유형과 의미를 묶음으로써 실제로 분리를 올바르게 수행하지 않았으며 여전히 종속성이 있습니다.

"이 코드는이 인터페이스를 구현하고 데이터 컨텍스트를 사용하는 한 모든 유형의 저장소와 대화 할 수 있습니다."

이제 다른 IOC 컨테이너가 이것을 지원하고 있다는 것을 알고 있으며, 내 첫 번째 버전에서도 그것을 가지고 있었지만 내 의견으로는 해상도 단계에 속하지 않습니다.

< /2 센트>

감사합니다 ... 내 것은 "존재"의 게시물과 비슷합니다. 아래를 참조하십시오 :

        IUnityContainer container = new UnityContainer();
        container.LoadConfiguration();

        _activeDirectoryService = container.Resolve<IActiveDirectoryService>(new ResolverOverride[]
        {
            new ParameterOverride("activeDirectoryServer", "xyz.adserver.com")
        });

ResolvedParameter <t> ( "이름") 내의 주입 아키텍처에 따라 주입 공자 / 주입 프로파인 / 주입 메토드를 사용하여 컨테이너에서 사전 등록 된 물체의 인스턴스를 얻을 수 있습니다.

귀하의 경우이 객체는 이름으로 등록되어야하며 동일한 삽입을 위해서는 lifetimemanager와 함께 containerControlledLifetImemanager ()가 필요합니다.

_unityContainer.RegisterType<IDataContext,DataContextA>("DataContextA", new ContainerControlledLifeTimeManager());
_unityContainer.RegisterType<IDataContext,DataContextB>("DataContextB");

  var repositoryA = _unityContainer.Resolve<IRepositoryA>(new InjectionConstructor(
new ResolvedParameter<IDataContext>("DataContextA")));

  var repositoryB = _unityContainer.Resolve<IRepositoryB>(new InjectionConstructor(
new ResolvedParameter<IDataContext>("DataContextA")));

  var repositoryA2 = _unityContainer.Resolve<IRepositoryA>(new InjectionConstructor(
new ResolvedParameter<IDataContext>("DataContextB")));

매우 짧은 대답은 다음과 같습니다. Unity는 현재 매개 변수를 일정하거나 주입되지 않은 생성자로 전달할 수있는 방법이 없습니다. IMHO는 그것이 누락 된 가장 큰 단일이지만, 나는 그것이 누락보다는 디자인에 의한 것이라고 생각합니다.

Jeff Fritz가 지적한 것처럼, 이론적으로 다양한 유형에 주입 할 컨텍스트 인스턴스를 알고있는 사용자 정의 수명 관리자를 만들 수 있지만, 이는 처음에 Unity 또는 DI를 사용하는 목적을 없애는 수준의 하드 코딩입니다.

Full DI에서 작은 단계를 거쳐서 자체 데이터 컨텍스트를 설정하는 리포지토리 구현을 담당 할 수 있습니다. 문맥 사례 컨테이너에서 여전히 해결 될 수 있지만 사용해야 할 논리는 저장소의 구현에 들어가야 할 논리입니다. 확실히 순수하지는 않지만 문제를 제거 할 것입니다.

당신이 사용할 수있는 또 다른 대안 (그것이 좋은 관행인지 아닌지는 알지 못합니다) 두 컨테이너를 생성하고 각각에 대한 인스턴스를 등록하는 것입니다.

IDataContext context = _unityContainer.Resolve<IDataContext>();
_unityContainer.RegisterInstance(context);
var repositoryA = _unityContainer.Resolve<IRepositoryA>(); //Same instance of context
var repositoryB = _unityContainer.Resolve<IRepositoryB>(); //Same instance of context


//declare _unityContainer2
IDataContext context2 = _unityContainer2.Resolve<IDataContext>(); //New instance
_unityContainer2.RegisterInstance(context2);
var repositoryA2 = _unityContainer2.Resolve<IRepositoryA>(context2); //will retrieve the other instance

이것이 도움이되기를 바랍니다

Notdan, 나는 당신이 Lassevk에 대한 의견으로 자신의 질문에 답했을 것입니다.

먼저 Lifetimemanager를 사용하여 Unity가 생성하는 Idatacontext의 수명주기 및 수를 관리합니다.
http://msdn.microsoft.com/en-us/library/cc440953.aspx

그것은처럼 들린다 ContainerControlledLifetimeManager 객체는 필요한 인스턴스 관리를 제공합니다. 해당 LifetImemanager를 사용하면 Unity는 IDATACONTEXT의 동일한 인스턴스를 IDATACONTEXT 종속성이 필요한 모든 객체에 추가해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top