Asp.net mvc asp.net mvc服务层和工作单元
可能重复:Asp.net mvc asp.net mvc服务层和工作单元,asp.net-mvc,Asp.net Mvc,可能重复: 嗨。我正在使用以下体系结构开发ASP.NET MVC web应用程序: 用户界面->控制器->服务层->存储库。这里的问题是在哪里公开工作单元模式。例如,我有: public class SomeController { public ActionResult AnAction() { using(var unitOfWork = UnitOfWorkManager.Create()) { try
嗨。我正在使用以下体系结构开发ASP.NET MVC web应用程序: 用户界面->控制器->服务层->存储库。这里的问题是在哪里公开工作单元模式。例如,我有:
public class SomeController
{
public ActionResult AnAction()
{
using(var unitOfWork = UnitOfWorkManager.Create())
{
try
{
this.ServiceA.Foo();
this.ServiceB.Foo();
unitOfWork.Commit();
}
catch(Exception ex)
{
unitOfWork.Rollback();
}
}
}
}
控制员了解工作单元是否合适?如果我们有多个对不同服务的调用,但在同一个操作方法中,我们需要事务性行为,该怎么办?我们已经用相同的体系结构构建了一个应用程序,我们的观点是UOW类只在服务中使用。原因:
public ActionResult List()
{
var things = ThingService.GetAll();
return View(things);
}
服务
public IEnumerable<Thing> GetAll()
{
using (ObjectContext context = new Container(ConnectionString))
{
var work = new UnitOfWork(context);
return work.Things.GetAll());
}
}
public IEnumerable GetAll()
{
使用(ObjectContext上下文=新容器(ConnectionString))
{
var-work=新的工作单元(上下文);
返回work.Things.GetAll());
}
}
希望这有帮助您的问题也在SO中讨论过:谢谢,但是当一个用户操作需要对多个服务进行操作时,您是如何处理的,就像我的情况一样?根据您的响应,我假设ServiceA对象将包含对ServiceB对象的引用,并从ServiceA.Foo()调用方法ServiceB.Foo()。我认为这会使架构复杂化。Markus在大多数情况下,我们的服务被设计成封装一个事务逻辑。因此,在这种情况下,如果服务处理了所有业务逻辑,然后需要发送一封电子邮件(另一个服务),它就会知道该服务(使用依赖项注入注入)。如果是更复杂的情况,则通过服务上的命令模式,您可以建立服务事务,例如航班预订被更改,从而影响相关的汽车预订。但我们这样做是为了能够混合和匹配服务,您可能不需要这种灵活性……您在哪里调用
提交
?根据您的示例,每个服务都应该自己调用Commit
,但如果多个服务相互交互,您可能会多次访问DB,对吗?@ebramtharwat我现在在更新多个项目时面临类似的问题。我应该在我的服务上有一个save方法,在一切都设置好后调用它吗?我应该在我的服务之外有一个UOW实例来调用Commit。如果我有一个传入对象的save方法,该方法对该对象不做任何处理,只需调用uow.commit()。@kheit,没有一个有效的解决方案。总之,您应该调用uow.commit()
应该从最初启动请求的层开始,我相信这将是表示层,因为它是最敏感的层。这种方法的问题是,在某些情况下,您需要在输入另一个新数据之前保存一些数据。对不起,我迟了答复。