在MVC中使用Unity注册ObjectContext

时间:2012-11-13 17:47:30

标签: asp.net-mvc asp.net-mvc-3 dependency-injection unity-container

目前,我正在将一个工作单元实例注入我控制器中的服务层对象:

public class OrderController : Controller
{
private IUnitOfWork _unitOfWork;
private IOrderService _recipeService;
private IInventoryService _inventoryService;

public OrderController(IUnitOfWork unitOfWork, IOrderService orderService, IInventoryService inventoryService)
{
    _unitOfWork = unitOfWork;
    _orderService = orderService;
    _inventoryService = inventoryService
    //Use property injection to apply the Unit of Work context and validation state to our services
    _orderService.Context = _unitOfWork;
    _inventoryService.Context = _unitOfWork;
}

理想情况下,我想从控制器中删除UoW上下文,并在注册期间定义UoW的生命周期,以便在HTTP请求的范围内使用相同的UoW。在请求期间实例化的每个服务对象将具有通过Unity注入的相同实例UoW。我也想在我的控制器中使用异步操作,我不确定那里是否有任何影响。

HierarchicalLifetimeManager的描述听起来像我想要的,但我想要110%肯定,因为我认为如果我弄错了我可能最终得到一个调试噩梦(参考:http://unitymvc3.codeplex.com/

以下注册是否会为我提供所需的行为,还是应该采用另一种方式?

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

谢谢!

克里斯

1 个答案:

答案 0 :(得分:1)

HierarchicalLifetimeManager仅适用于Unity.MVC3解决方案中的其他插件。 LifetimeManager的工作方式类似于单例ContainerControlledLifetimeManager,但子容器获取所创建的任何实例的新版本。

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

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