Reputation: 11607
I have a Windows Service that starts up multiple Tasks to run concurrently for each registered IService. Each IService makes use of a couple Managers which each make use of a Dependency. I want to have a singleton of Dependency to be used across all Managers with-in a Service (i.e. each Service has a singleton of Dependancy shared by its managers). I have Dependency registered with HeirarchialLifeTimeManager. How do I create or register each IService so that it gets its own singleton of Dependency?
var _container = new UnityContainer();
_container.RegisterType<Dependency>(new HierarchicalLifetimeManager());
_container.RegisterType<MgrA1>();
_container.RegisterType<MgrA2>();
_container.RegisterType<MgrB1>();
_container.RegisterType<MgrB2>();
_container.RegisterType<IService, SvcA>("A");
_container.RegisterType<IService, SvcB>("B");
var services = _container.Resolve<IService[]>()
foreach(var svc in services)
{
Task.Factory.StartNew(() => svc.Start());
}
// dependencies (via constructors)
SvcA(MgrA1, MgrA2)
SvcB(MgrB1, MgrB2)
MgrA1(Dependency)
MgrA2(Dependency)
MgrB1(Dependency)
MgrB2(Dependency)
I want to get 2 instances of Dependency, one for SvcA and its managers, and one for SvcB and its managers. I've tried registering each service in its own child container with .CreateChildContainer() but then they don't resolve when called on the parent container to get all the services and start them.
Upvotes: 0
Views: 593
Reputation: 7505
HierarchicalLifetimeManager
actually means "There can be only a single instance of that for anything resolved by that container, and any child containers".
If you set _container.RegisterType<Dependency>(new HierarchicalLifetimeManager());
to instead be _container.RegisterType<Dependency>(new PerResolveLifetimeManager());
, and then resolve your IServices
indivually, instead of as an array, you'd end up having 2 instances of Dependency
, one for (MgrA1, MgrA2) and one for (MgrB1, MgrB2).
You could do something like that for the resolve (Haven't tested THAT code, but I've done something similar):
foreach (var containerRegistration in _container.Registrations)
{
// If registration type (or interface) implements IService
if (typeof(IService).IsAssignableFrom(containerRegistration.MappedToType))
{
var svc = _container.Resolve(Resolve(containerRegistration.RegisteredType), containerRegistration.Name);
Task.Factory.StartNew(() => svc.Start());
}
}
Upvotes: 1