如何让工作单元与服务模式一起运行?
How to get Unit of Work to function with Service Pattern?
我正在使用工作单元模式,如 article 中所述。文章解释说每个服务都应该注入一个UnitOfWork:
private readonly IUnitOfWork _unitOfWork;
此外,服务必须有一个 public 方法来提交工作单元操作:
public void Save()
{
_unitOfWork.Commit();
}
Save 方法只能由调用服务的 (webapi) 控制器调用。
但这是我的担忧:
1) 控制器可能会调用多个服务来更新数据库,在哪种情况下它应该为每个服务调用 Save()?如果需要回滚怎么办?
喜欢:
[HttpGet]
public IHttpActionResult UpdateArchive()
{
_service1.DoUpdate();
_service1.Save();
_service2.DoUpdate();
_service2.Save();
}
如果 service2.Save 失败怎么办?
2) 如果一个服务调用另一个服务怎么办,控制器如何知道要调用哪个保存?
我对这个工作单元有点困惑。
and in which case it should call Save() for each service
这取决于服务是否共享相同的工作单元。如果是,请对其中任何一个调用 Save
,它将操作委托给同一个 UoW。
What then if a rollback is needed
既然没有交易,你应该如何回滚?
另一方面,在编排上引入显式事务使得回滚更改变得微不足道:
try
{
using ( TransactionScope scope = new TransactionScope() )
{
_service1.DoUpdate();
_service1.Save();
_service2.DoUpdate();
_service2.Save();
scope.Complete();
}
}
catch
{
// rollback occurs since the transaction was not completed
}
TransactionScope
非常方便,因为它可以正确处理共享 UoW 上的事务和注入不同服务的多个不同 UoW 上的事务。
What if service2.Save fails?
你回滚事务,这里几乎没有其他选择。
无论如何,repositories/uow over EF are disputable。您的部分问题是多个服务共享同一个 UoW 实例,因此基本上您调用哪个 Save
并不重要,它们都在同一个 DbContext
上调用 SaveChanges
。
我的意见(尽管这里应该避免意见)是你可以从你的服务中删除 Save
s 并在你的数据库上下文中坚持使用单个 SaveChanges
编排。这将使意图更加清晰 - 服务将更改 UoW 的内部状态,但持久更改的责任在控制器上。
我正在使用工作单元模式,如 article 中所述。文章解释说每个服务都应该注入一个UnitOfWork:
private readonly IUnitOfWork _unitOfWork;
此外,服务必须有一个 public 方法来提交工作单元操作:
public void Save()
{
_unitOfWork.Commit();
}
Save 方法只能由调用服务的 (webapi) 控制器调用。
但这是我的担忧:
1) 控制器可能会调用多个服务来更新数据库,在哪种情况下它应该为每个服务调用 Save()?如果需要回滚怎么办?
喜欢:
[HttpGet]
public IHttpActionResult UpdateArchive()
{
_service1.DoUpdate();
_service1.Save();
_service2.DoUpdate();
_service2.Save();
}
如果 service2.Save 失败怎么办?
2) 如果一个服务调用另一个服务怎么办,控制器如何知道要调用哪个保存?
我对这个工作单元有点困惑。
and in which case it should call Save() for each service
这取决于服务是否共享相同的工作单元。如果是,请对其中任何一个调用 Save
,它将操作委托给同一个 UoW。
What then if a rollback is needed
既然没有交易,你应该如何回滚?
另一方面,在编排上引入显式事务使得回滚更改变得微不足道:
try
{
using ( TransactionScope scope = new TransactionScope() )
{
_service1.DoUpdate();
_service1.Save();
_service2.DoUpdate();
_service2.Save();
scope.Complete();
}
}
catch
{
// rollback occurs since the transaction was not completed
}
TransactionScope
非常方便,因为它可以正确处理共享 UoW 上的事务和注入不同服务的多个不同 UoW 上的事务。
What if service2.Save fails?
你回滚事务,这里几乎没有其他选择。
无论如何,repositories/uow over EF are disputable。您的部分问题是多个服务共享同一个 UoW 实例,因此基本上您调用哪个 Save
并不重要,它们都在同一个 DbContext
上调用 SaveChanges
。
我的意见(尽管这里应该避免意见)是你可以从你的服务中删除 Save
s 并在你的数据库上下文中坚持使用单个 SaveChanges
编排。这将使意图更加清晰 - 服务将更改 UoW 的内部状态,但持久更改的责任在控制器上。