如何让 Unity Container 将注册名称沿链向下级联?

How can I get Unity Container to cascade the registration name down the chain?

考虑以下几点:

public class MyService : IService {
  public MyService(IDbSession session) {}
}


// Service used both by controller and background work.
container.RegisterType<IService, MyService>(new TransientLifetimeManager());

// Database session when used from a controller
container.RegisterType<IDbSession, DbSession>(new PerRequestLifetimeManager());
// Database session as used when doing background work
container.RegisterType<IDbSession, DbSession>("BackgroundWork", new TransientLifetimeManager());



// At run-time I expect the named resolution to be "cascading" down to the IDbSession named registration.
container.Resolve<IService>("BackgroundWork");

我想用 "BackgroundWork" 名称解析 IDbSession,因为 IService 正在用那个名称解析。

Unity 不会这样做,除非我在 InjectionConstructor 中手动指定构造函数参数,这不是那么直观。随着我的服务签名的更改,我必须保持更新。

我怎样才能以最不痛苦的方式做到这一点?

想法是,在进行后台工作时,我的 Db 会话必须由进行后台工作的 class 管理,而不是请求。

您可以使用子容器。

 IUnityContainer container = new UnityContainer();
 container.RegisterType<IService, MyService>(new TransientLifetimeManager());
 container.RegisterType<IDbSession, DBSession>(new PerRequestLifetimeManager());

 IUnityContainer childContainer = container.CreateChildContainer();
 childContainer.RegisterType<IDbSession, DBSession>(new TransientLifetimeManager());

 IService parentService = container.Resolve<IService>();
 IService parentService2 = container.Resolve<IService>();
 IService childService = childContainer.Resolve<IService>();
IService childService2 = childContainer.Resolve<IService>();

内科Window:

?parentService.GetHashCode()
45653674
?parentService2.GetHashCode()
41149443
//one service instance per resolve
?parentService.session.GetHashCode()
39785641
?parentService2.session.GetHashCode()
39785641
//same DBSesion in every service resolved per HTTP request
?childService.GetHashCode()
45523402
?childService.session.GetHashCode()
35287174
//new Service and DbSession per resolve
?childService2.GetHashCode()
44419000
?childService2.session.GetHashCode()
52697953