2010-11-09 109 views
3

可能重复:
How to implement Unit of work in MVC: Responsibilityasp.net的MVC服务层和单元

嗨。我正在使用以下架构开发ASP.NET MVC Web应用程序: UI - > Controller - > Service Layer - > Repository。这里的问题是在哪里公开工作单元模式。例如我有:

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

可以让控制器了解工作单元吗?如果我们有多次调用不同的服务,但在同一个操作方法中,我们需要事务性行为?

+2

你的问题也在讨论SO:http://stackoverflow.com/questions/2238428/ how-to-implement -move-responsibility-working-unit-of-work-in-mvc-responsibility – tshao 2010-11-09 01:26:10

回答

4

我们已经构建了一个具有相同体系结构的应用程序,我们认为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()); 
    } 
} 

希望这有助于

+1

谢谢,但是你是如何处理这种情况的,例如一个用户操作需要操作像我这样的服务?根据你的回应,我假设ServiceA对象将包含对ServiceB对象的引用和来自ServiceA.Foo()的调用方法ServiceB.Foo()。我认为这会让架构复杂化。 – Markus 2010-11-09 12:30:22

+3

马库斯在大多数情况下我们的服务旨在封装一个交易逻辑。所以在这种情况下,如果服务处理了所有的业务逻辑,然后需要发送一封电子邮件(另一个服务),它会知道该服务(注入使用依赖注入)。如果它比较复杂,那么服务上的命令模式可以让你建立一个服务事务,例如航班预订更改并影响相关的汽车预订。但是我们这样做是为了能够混合和匹配服务,您可能不需要这种灵活性...... – abarr 2010-11-09 13:31:01

+0

您在哪里调用'Commit'?根据你的例子,每个服务应该自己调用'Commit',但是在多个服务互相交互的情况下,你最终可能会多次访问DB,对吧? – 2014-07-08 12:00:50