我们正在开发具有以下体系结构的.Net应用程序:表示层(在ASP.Net MVC 2中使用MVC模式),服务层,数据访问层(在Entity Framework上使用存储库模式)。
我们已经决定将事务管理放在服务层中,但是我们不确定如何实现它。我们希望完全在服务层级别上控制事务。也就是说,每次 Controller 在服务层中调用方法时,它都必须是与数据库更新有关的原子操作。
如果在服务层中提供的不同服务之间没有关系,那将很简单:每个方法都应在其执行结束时提交更改(即,在其使用的上下文中调用save方法)。但是有时服务层的服务会协同工作。
例如:我们提供的 cargo 服务具有一种确认方法,该确认方法接收以下参数: cargo ID,一个标志(指示它对应于新客户还是现有客户),客户ID(如果 cargo 确认是针对现有客户的,则为客户ID)客户)和客户名称(如果是新客户)。如果标记设置为“新客户”,则服务层必须(a)创建客户并(b)确认装运。对于(a), cargo 服务调用了客户服务(该客户服务已经实现了创建新客户并将其存储在数据库中所需的验证和逻辑)。
在这种情况下,谁应该承担更改?
有没有我们应该遵循的设计模式?
最佳答案
我在我的服务上有一个Commit(),仅当UnitOfWork由服务创建时才提交,如果在构造函数中传递,则该提交不执行任何操作。
我为服务使用了第二个(内部)构造函数:
public class MyService
{
private IUnitOfWork _uow;
private bool _uowInternal;
public MyService()
{
_uow = new UnitOfWork();
_uowInternal = false;
}
internal MyService(IUnitOfWork uow)
{
_uow = uow;
_uowInternal = true;
}
public MyServiceCall()
{
// Create second service, passing in my UnitOfWork:
var svc2 = new MySecondService(_uow);
// Do your stuff with both services.
....
// Commit my UnitOfWork, which will include all changes from svc2:
Commit();
}
public void Commit()
{
if(!_uowInternal)
_uow.Commit();
}
}
关于asp.net-mvc - 如何在服务层中管理交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4867027/