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类只在服务中使用。原因:

  • 我们认为操作应该只有视图逻辑,因此如果可能的话,应该不知道与使用多个存储库调用相关的业务规则
  • 业务逻辑规则应该(尽可能)存在于服务中。我们的服务使用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()
    应该从最初启动请求的层开始,我相信这将是表示层,因为它是最敏感的层。这种方法的问题是,在某些情况下,您需要在输入另一个新数据之前保存一些数据。对不起,我迟了答复。