gpt4 book ai didi

c# - MVC 3,在哪里提交工作单元?

转载 作者:行者123 更新时间:2023-11-30 17:11:45 24 4
gpt4 key购买 nike

我刚刚使用 MVC 3、Fluent nHibernate、AutoMapper 和 Autofac 建立了一个项目,利用了通用存储库、工作单元模式和 3 层设计。我现在遇到了这个问题:

我有一个工作单元,但我不知道在哪里/如何提交它。开始它更容易;使用 Autofac,在每个 HTTP 请求的基础上注入(inject)——我的工作单元的构造函数开始事务。然而,我意识到我最终得到了这样的商务类(class):

private readonly IUnitOfWork _unitOfWork;
private readonly IUserRepository _userRepository;

public UserHandler(
IUserRepository userRepository,
IUnitOfWork unitOfWork)
{
_userRepository = userRepository;
_unitOfWork = unitOfWork;
}

public void CreateUser(User user)
{
// Fill the date fields
user.CreationDt = DateTime.Now;
user.ModifiedDt = DateTime.Now;

// Add the user
_userRepository.Add(user);

// Commit the changes
_unitOfWork.Commit();
}

这很好,只要我不需要进行任何其他交易。但是,如果在调用 .Add 之后,我决定用类似的方法调用另一个业务类呢?然后我有 2 次提交,我假设这会失败,因为我将尝试结束一个已经完成的事务。

我考虑过将提交放在我的 UnitOfWork 的 Dispose 中,但如果发生异常,那将是个坏消息。我见过一些情况,人们也将他们的 UnitOfWork 注入(inject)到他们的 Controller 中,但这似乎是错误的,因为它打破了关注点分离,你的 Controller 绕过业务层并直接调用数据库层。最后,我目前正在研究使用 the one 之类的属性在 Sharp Architecture 中使用,但我也不确定这是否是正确的方法(同样,您不是让 Controller 直接访问/了解数据层吗?)。

有人可以分享一些关于我应该在哪里 promise 的智慧吗?

最佳答案

就您在一个请求中共享您的数据库连接而言,您可以开始事务并在将响应发送到客户端后提交。我领导了一个特殊的 Action 过滤器来实现这一点。

public sealed class CommitOnSuccess : ActionFilterAttribute
{
public IUnitOfWork UnitOfWork { get; set; }

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Exception == null)
UnitOfWork.Commit();
}
}

这就是我如何使我的操作方法简单明了

[CommitOnSuccess]
[HttpPost]
public ActionResult Create(ApplicationManagementViewModel model)
{

}

并且将在 Create 方法中对从存储库中获取的实体执行更改

关于c# - MVC 3,在哪里提交工作单元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11195804/

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