【问题标题】:asp.net mvc service layer and unit of work [duplicate]asp.net mvc服务层和工作单元[重复]
【发布时间】:2010-11-09 20:22:28
【问题描述】:

可能重复:
How to implement Unit of work in MVC: Responsibility

嗨。我正在使用以下架构开发 ASP.NET MVC Web 应用程序: UI -> 控制器 -> 服务层 -> 存储库。这里的问题是在哪里公开工作单元模式。例如我有:

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();
            }         
        }
    }
}

控制器可以知道工作单元吗?如果我们在同一个操作方法中多次调用不同的服务并且我们需要事务行为怎么办?

【问题讨论】:

标签: asp.net-mvc


【解决方案1】:

我们已经构建了一个具有相同架构的应用程序,我们认为 UOW 类仅用于服务中。原因:

  1. 我们认为操作应该只有视图逻辑,所以如果可能的话,不应该知道与使用多个存储库调用相关的业务规则
  2. 业务逻辑规则应该(尽可能)在服务中。我们的服务使用 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());
    }
}

希望对你有帮助

【讨论】:

  • 谢谢,但是当一个用户操作需要对多个服务进行操作时,您是如何处理这种情况的,就像我的情况一样?根据您的回复,我假设 ServiceA 对象将包含对 ServiceB 对象的引用并从 ServiceA.Foo() 调用方法 ServiceB.Foo()。我认为这会使架构复杂化。
  • Markus 在大多数情况下,我们的服务旨在封装一个事务逻辑。因此,在这种情况下,如果服务处理了所有业务逻辑,然后需要发送电子邮件(另一个服务),它就会知道该服务(使用依赖注入注入)。如果它更复杂,那么服务上的命令模式可以让你建立一个服务事务,例如航班预订发生更改,这会影响相关的汽车预订。但我们这样做是为了混合和匹配服务,您可能不需要这种灵活性......
  • 你在哪里打电话给Commit?根据您的示例,每个服务都应自行调用Commit,但在多个服务相互交互的情况下,您最终可能会多次访问数据库,对吧?
  • @ebramtharwat 我现在在更新多个项目时遇到了类似的问题。我应该在我的服务上有一个保存方法,一旦一切都设置好我就调用它吗?我是否应该在我的服务之外有一个 UOW 实例来调用 Commit。如果我有一个传递对象的保存方法,该方法对对象不执行任何操作,只需调用 uow.commit()。
  • @kheit,这个问题没有一个有效的解决方案。恕我直言,您应该调用uow.commit() 应该从最初开始请求的层完成,我认为这将是表示层,因为它将是最有意识的层。这种方法的问题在于,在某些情况下,您需要在输入另一个新数据之前保存一些数据。抱歉我的回复晚了。
猜你喜欢
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2014-02-25
  • 1970-01-01
  • 2011-09-18
相关资源
最近更新 更多