0

所以MVC被拆分成

  • 模型
  • 看法
  • 控制器层

我以为在准备好很多页面后我已经掌握了每一层的作用,但我仍然对一个领域感到困惑,那就是模型或控制器中是否应该有东西。

我知道数据存储类应该放在控制器中 我知道 UI 修改器(即拉出正确的模型)应该放在控制器中

但是模型修饰符呢。因此,例如,如果我们采用软件购物车方法,假设有人单击结帐按钮,填写他们的付款详细信息并且所有内容都已批准,则回发恰好可以处理此问题。

回发对象需要

  1. 在数据库表中添加一个条目,表示允许 X 用户下载 Y 软件
  2. 向用户发送收据
  3. 记录购买

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

我是否应该在 MVC 中仍然拥有这些类,如果是,它们将是作为控制器还是模型的类?

4

2 回答 2

4

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

坚持 SOLID 原则,我们绝对同意我们正在处理(至少)三个独立的组件:

  1. 持久化用户 x 下载软件 y 的数据
  2. 开具收据
  3. 日志记录

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

于 2012-07-13T21:38:59.967 回答
3

要更详细地扩展Russ 的出色答案,请考虑以下几点:

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

控制器根本没有做任何生意。它为用户提供控制流。现在,考虑将这个依赖注入到控制器中:

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
    }
}

在这 三篇 文章中有一些关于像这样使用接口 + DI 的重要信息。

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

于 2012-07-13T21:55:52.267 回答