1

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

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());

谢谢!

克里斯

4

1 回答 1

1

HierarchicalLifetimeManager 仅因 Unity.MVC3 解决方案中的其他管道而起作用。LifetimeManager 的工作方式类似于单例 ContainerControlledLifetimeManager,但子容器会获得创建的任何实例的新版本。

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

如果您正在使用 Unity.MVC3 项目的其余部分,则使用 Hierarchical LM 可以正常工作。使用自定义 LifetimeManager 有类似的方法可以实现相同的结果:请参阅CodePlex 上的此线程

于 2012-11-16T01:20:19.200 回答