2016-04-19 2 views
1

Я использую Unity в качестве контейнера, и мне интересно, может ли он помочь мне решить проблему. У меня есть 2 службы, Service1 и Service2. Оба они зависят от другого объекта, и позволяют называть его IFoo. Я хочу, чтобы каждый сервис получил свой собственный экземпляр IFoo, но в то же время я не хочу, чтобы все остальные. По сути, он должен быть одним, но ограниченным. Я думал об использовании комбинации детских контейнеров для достижения этого, но он не работает, как я надеялся. Идея состоит в том, что IFoo содержит некоторые сведения о соединении, специфичные для Service1 и Service2 и некоторых других объектов, разрешенных контейнером. Ниже приведен некоторый код, который, надеюсь, сделает его более ясным.Контейнерная иерархия

Код, разрешающий ViewController, будет знать только о родительском контейнере.

var parentContainer = new UnityContainer(); 
parentContainer.RegisterType<IParentScope, ParentScoped>(
    new ContainerControlledLifetimeManager()); 

var childContainer1 = parentContainer.CreateChildContainer(); 
childContainer1.RegisterInstance<IFoo>(new Foo("Unique to Child Container 1"), 
    new ContainerControlledLifetimeManager()); 
childContainer1.RegisterType<IService1, Service1>(
    new ContainerControlledLifetimeManager()); 

var childContainer2 = parentContainer.CreateChildContainer(); 
childContainer2.RegisterInstance<IFoo>(new Foo("Unique to Child Container 2"), 
    new ContainerControlledLifetimeManager()); 
childContainer2.RegisterType<IService2, Service2>(
    new ContainerControlledLifetimeManager()); 

var viewController = parentContainer.Resolve<ViewController>(); 


public class ViewController 
{ 
    public ViewController(IParentScope parentScope, IService1 service1, IService2 service2) 
    { 
     ParentScope = parentScope; 
     Service1 = service1; 
     Service2 = service2; 
    } 

    public IParentScope ParentScope { get; set; } 
    public IService1 Service1 { get; set; } 
    public IService2 Service2 { get; set; } 
} 
+0

Возможно, вы захотите объяснить свой конкретный вариант использования, потому что, как я вижу, ваш подход испорчен. Можете ли вы обновить свой вопрос и предоставить подробную информацию о том, что вы делаете (с реальными именами классов и кодом, который демонстрирует, что вы делаете)? – Steven

+0

Вы не хотите, чтобы Service1 и 2 делили экземпляр IFoo, но как насчет других сервисов? Собираются ли они поделиться экземпляром, предоставленным Service1 OR Service2? Почему тогда нужно быть Синглтоном? –

ответ

1

Спасибо за ваши замечания ребята. Я, возможно, не объяснил это так хорошо, но я понял, что могу заставить его работать с использованием названных регистраций.

var foo1 = new Foo("FOO 1"); 
     parentContainer.RegisterInstance<IFoo>("Foo1", foo1); 

     var foo2 = new Foo("FOO 2"); 
     parentContainer.RegisterInstance<IFoo>("Foo2", foo2); 

     parentContainer.RegisterType<IService1, Service1>(new ContainerControlledLifetimeManager(), new InjectionConstructor(new ResolvedParameter<IFoo>("Foo1"))); 
     parentContainer.RegisterType<IService2, Service2>(new ContainerControlledLifetimeManager(), new InjectionConstructor(new ResolvedParameter<IFoo>("Foo2"))); 

Лучшим вариантом Я теперь обнаружил его использовать [Завис («Foo1»)] атрибут конструктора Service1. Это позволяет мне указать одну именованную зависимость.

 Смежные вопросы

  • Нет связанных вопросов^_^