gpt4 book ai didi

c# - 在 ASP.NET MVC 3 中的许多服务之间共享一个工作单元

转载 作者:太空狗 更新时间:2023-10-30 00:05:51 25 4
gpt4 key购买 nike

我的 Controller 使用 2 个或更多服务。反过来,我的服务构建并使用它们自己的工作单元类实例(可以访问存储库)。

我希望我的服务共享同一个工作单元实例,并使其可进行单元测试。我的问题是:

  1. 我应该将工作单元和服务注入(inject)我的 Controller 吗?
  2. 我还需要将工作单元注入(inject)到我的服务中。在哪里我应该这样做吗?非常感谢。

最佳答案

我喜欢将 DI 与 Action 过滤器相结合,这样容器就可以管理工作单元的范围,但是 begin/commit/rollback 会自动为你调用,你不必在每次都为之操心行动。

这有点棘手,因为通常情况下,actionfilters 不会根据请求重新实例化,所以当你有一个你确实希望每个请求(工作单元)的依赖项时,你需要使用一些魔法。

下面是我如何使用 Ninject 和 Ninject.Web.Mvc 执行此操作

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class UnitOfWorkAction : Attribute
{
}

public class UnitOfWorkActionFilter : IActionFilter
{
private IUnitOfWork _unitOfWork;

public UnitOfWorkActionFilter(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}

public void OnActionExecuting(ActionExecutingContext filterContext)
{
_unitOfWork.Begin();
}

public void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Exception == null)
{
try
{
_unitOfWork.Commit();
}
catch
{
_unitOfWork.Rollback();
throw;
}
}
else
{
_unitOfWork.Rollback();
}
}
}

然后我配置应该如何在 App_Start/NinjectMVC3.cs 中使用属性

kernel.BindFilter<UnitOfWorkActionFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<UnitOfWorkAction>();
//also make sure your IUnitOfWork is bound per request, obviously

最后,一个示例 Action

[UnitOfWorkAction]
public ActionResult SomeAction(int id)
{
//invoke your services here, and the uow will be automatically committed or rolled back when the action returns
}

另外值得注意的是,这种方法允许您将依赖项的构造函数注入(inject)到操作过滤器中,而不仅仅是我非常喜欢的属性注入(inject)。

关于c# - 在 ASP.NET MVC 3 中的许多服务之间共享一个工作单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7653020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com