1

目前,我注入工作单元的一个实例为我服务层对象在我的控制器控制器,并且在注册期间定义了UoW的生命周期,以便在HTTP请求的范围内使用相同的UoW。在请求期间实例化的每个服务对象都将通过Unity注入相同的实例UoW。我也想在我的控制器中使用异步操作,我不确定这里是否有任何影响。注册ObjectContext的使用Unity在MVC

的HierarchicalLifetimeManager的描述听起来像我想要什么,但我想是110%肯定的,因为我觉得,如果我犯了这个错误,我可以用一个调试的噩梦结束了(参考:http://unitymvc3.codeplex.com/

会以下注册为我提供了期望的行为,还是应该以另一种方式进行处理?

container.RegisterType<IOrderService, OrderService>(); 
container.RegisterType<IInventoryService, InventoryService>(); 
container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager()); 

谢谢!

克里斯

回答

1

的HierarchicalLifetimeManager只能因为Unity.MVC3解决其他plubming的。 LifetimeManager的工作方式与单例ContainerControlledLifetimeManager类似,但子容器可以获得创建的任何实例的新版本。

Unity.MVC3项目的工作方式是每个请求都使它自己存储在HttpRequest.Current.Items中的子容器(请参阅该项目中的UnityDependencyResolver),然后在请求结束时处理该容器(这是RequestLifetimeHttpModule)。通常,这意味着任何ContainerControlled注册将从父级检索,但是在每个子容器中都会重新创建任何分层重新配置(如您的UoW)。这意味着你得到你想要的:每个请求的新实例,然后在请求结束时进行Dispose。

如果您使用Unity.MVC3项目的其余部分,那么使用Hierarchical LM工作正常。使用自定义LifetimeManager可以获得相同结果的方法类似:请参阅CodePlex上的this thread