2012-07-13 171 views
0

所以MVC被分成UI VS业务逻辑MVC

  • 型号
  • 查看
  • 控制器层

我想我有准备以后有什么每层做一抓许多页面,但我仍然难倒一个区域,这是如果事情应该在模型或控制器去。

据我所知,数据存储类应在控制器 去,我明白,用户界面改性剂(即右拉模型),应在控制器

但是,我们的模型修改器去。举例来说,如果我们采用软件购物车的方式,可以说有人点击结账按钮,填写他们的付款细节和全部批准,回发恰巧处理这一点。

回发对象需要

  1. 添加到数据库表中的条目说让X用户下载Ÿ软件
  2. 发送回执给用户
  3. 登录购买

通常(在一个非MVC)的方法,我会创建一个类来处理软件表的访问生成,它将调用EF来存储信息。我会有一个二级班来发送通知,第三班学习记录信息。

我还应该在MVC中有这些类吗?如果是的话,他们会作为控制器还是模型?

+3

这就是所有与模型有关的东西,所以它绝对是模型层。但这并不意味着它应该成为购物车类的一部分。您可能需要CartWriter或CartReader来处理购物车在数据库中的存储(或可能在其他地方)。 – 2012-07-13 21:33:46

回答

4

以上定义的所有三点构成了应用程序模型的一部分;控制器应该只处理模型和呈现给用户的UI表示(视图)之间的编排。

秉承SOLID原则,绝对会同意,我们面对的是(至少)三个独立的组件:

  1. 仍然存有用户X下载软件y中的数据
  2. 发出收据
  3. 记录

有很多方法可以组织架构和组件来完成此操作。一种方法是获得依赖于这三个组件的应用程序特定组件/服务并使用它们来执行列出的操作。然后控制器只依赖于这个组件。

3

要在更多的细节上Russ' great answer扩大,这样考虑:

public class CheckoutController 
{ 
    private readonly ICommandHandler<CheckoutCommand> _checkoutHandler; 

    public CheckoutController(ICommandHandler<CheckoutCommand> checkoutHandler) 
    { 
     _checkoutHandler = checkoutHandler; 
    } 

    [HttpPost] 
    public virtual ActionResult Post(CheckoutViewModel viewModel) 
    { 
     if (!ModelState.IsValid) return View(viewModel); 
     var command = Mapper.Map<CheckoutCommand>(viewModel); 
     _checkoutHandler.Handle(command); 
     return RedirectToAction("Complete"); 
    } 

    public virtual ActionResult Complete() 
    { 
     return View(); 
    } 
} 

控制器没有做任何事情businessy可言。它为用户提供控制流程。现在,考虑你有这样的相关性注入到控制器:

public class DomainCheckoutCommandHandler : ICommandHandler<CheckoutCommand> 
{ 
    private readonly IEntityDataStorage _repos; 
    private readonly IEmailSender _email; 
    private readonly ILogger _log; 

    public DomainCheckoutCommandHandler(IEntityDataStorage repos, 
     IEmailSender email, ILogger log) 
    { 
     _repos = repos; 
     _email = email; 
     _log = log; 
    } 

    public void Handle(CheckoutCommand command) 
    { 
     // use _repos to Add an entry to a database table 
     // use _email to issue the receipt 
     // use _log to log the purchase 
    } 
} 

有关于使用thesethreeposts接口+ DI这样一些伟大的信息。

最好的部分是您可以将MVC项目之外的所有其他代码 - 接口,域类和其他接口实现 - 全部移出。这样,MVC项目中没有任何事情做任何事情。它只是委托给由业务层或其他类库实现的接口。

+0

很好的例子丹! – 2012-07-13 22:52:58

+1

@RussCam,我从你的书中复制并粘贴了它。 – danludwig 2012-07-13 23:03:46