2017-05-17 1 views
0

2 개의 인터페이스가 있으며 하나는 다른 인터페이스를 상속합니다. 기본 인터페이스의 경우 싱글 톤 구현이 있고 하위 인터페이스의 경우 기본 구현을 장식하는 데코레이터 싱글 톤 구현이 있습니다.유니티 컨테이너가있는 데코레이터 패턴 사용 (싱글 톤용)

이제 기본 인터페이스가 다른 클라이언트에 삽입 (또는 확인)되면 기본 구현은 데코레이터가 아닙니다 (서브 인터페이스에 의존하는 경우에만 데코레이터를받습니다)

원하는 것은 데코레이터 구현이 각 클라이언트에 주입되어야하지만 기본 구현은 여전히 ​​구성되어야하고 데코레이터 싱글 톤에 주입되었습니다.

어떻게 설정하나요?

using System; 
using Microsoft.Practices.Unity; 

public interface IProvider 
{ 
    int GetValue(); 
} 

public interface ITracker : IProvider 
{  
} 

public class Provider : IProvider 
{ 
    public int GetValue() 
    { 
     Console.WriteLine("provider"); 
     return 0; 
    } 
} 

추적기 :

public class Tracker : ITracker 
{ 
    private readonly IProvider provider; 

    public Tracker(IProvider provider) 
    { 
     this.provider = provider; 
    } 

    public int GetValue() 
    { 
     Console.WriteLine("tracker"); 
     return provider.GetValue(); 
    } 
} 

프로그램 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new UnityContainer(); 

     container.RegisterType<IProvider, Provider>(
      new ContainerControlledLifetimeManager()); 
     container.RegisterType<ITracker, Tracker>(
      new ContainerControlledLifetimeManager()); 

     // want to get Tracker singleton instance here 
     var provider = container.Resolve<IProvider>(); 

     // want to get Tracker singleton instance here 
     var tracker = container.Resolve<ITracker>(); 
    } 
} 
+0

ITracker의 모든 인스턴스가 동일한 IProvider 인스턴스를 갖기를 원하십니까? – robjam

+0

하나의 공급자 인스턴스와 하나의 추적기 인스턴스 (둘 다 싱글 톤으로 등록) 만 있으면 추적기는 공급자를 종속성으로 가져옵니다. 그러나 클라이언트가 IProvider 또는 ITracker에 의존하는지에 관계없이 추적기 싱글 톤을 가져와야합니다. – user1803928

+0

그래서 IProvider 만 트래커 구현에 주입하기를 원합니다. IProvider가 다른 클래스에 종속되면 ITracker를 가져야합니까? – Scrobi

답변

0

내가 유니티의 전문가는 오전 없지만 이것이 내가 위로 나는 무엇을 : 트래커로

는 싱글 톤 IProvider를 생성자 매개 변수로 전달할 수 있습니다. 그런 다음 IProvider & ITracker를 추적기의 인스턴스로 해결하도록 설정합니다. 나는 여전히 IProvder를 ITracker에 던져야했지만.

var container = new UnityContainer(); 
container.RegisterType<IDependency, Dependency>(); 
container.RegisterType<IProvider, Provider>("Provider"); 


container.RegisterType<ITracker, Tracker> 
(
    new ContainerControlledLifetimeManager(), 
     new InjectionConstructor(
     new ResolvedParameter<IProvider>("Provider") 
)); 

container.RegisterType<IProvider, Tracker> 
(
    new ContainerControlledLifetimeManager(), 
     new InjectionConstructor(
     new ResolvedParameter<IProvider>("Provider") 
)); 

var p = container.Resolve<IProvider>() as ITracker; 
var t = container.Resolve<ITracker>(); 
+0

문제는이 솔루션을 사용하고 있습니다. 공급자 인스턴스를 직접 만들어야하지만 실제 시스템에서 공급자가 다른 종속성을 갖기 때문에 컨테이너를 만들어야합니다. – user1803928

+0

위의 코드를 사용하면 프로 바이더의 인스턴스를 작성하기 전에 의존성을 확립합니다. – Scrobi

+0

매핑 이름을 등록한 다음 생성자에 매개 변수를 삽입 할 때이 이름을 사용할 수 있습니다. – Scrobi