Я использую 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; }
}
Возможно, вы захотите объяснить свой конкретный вариант использования, потому что, как я вижу, ваш подход испорчен. Можете ли вы обновить свой вопрос и предоставить подробную информацию о том, что вы делаете (с реальными именами классов и кодом, который демонстрирует, что вы делаете)? – Steven
Вы не хотите, чтобы Service1 и 2 делили экземпляр IFoo, но как насчет других сервисов? Собираются ли они поделиться экземпляром, предоставленным Service1 OR Service2? Почему тогда нужно быть Синглтоном? –