MVC中的UI与业务逻辑

时间:2012-07-13 21:27:48

标签: c# asp.net-mvc

所以MVC分为

  • 型号
  • 查看
  • 控制器层

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

我知道数据存储类应该在Controller中 我知道UI修饰符(即拉动正确的模型)应该放在Controller中

但是模型修饰符呢?因此,例如,如果我们采取软件购物车方法,让我们说有人点击结帐按钮,填写他们的付款细节和所有批准,回复恰好处理这个。

回发对象需要

  1. 在数据库表中添加条目以表示允许X用户下载Y软件
  2. 向用户发送收据
  3. 记录购买
  4. 通常(在非MVC上)方法我会创建一个类来处理软件表的Access生成,该表将调用EF来存储信息。我会有一个二级类发送通知和第三类来记录信息。

    我是否还应该在MVC中使用这些类,如果是这样,它们会成为控制器或模型的类吗?

2 个答案:

答案 0 :(得分:4)

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

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

  1. 保留有关用户x下载软件y的数据
  2. 发出收据
  3. 登录
  4. 您可以通过多种方式组织架构和组件来执行此操作。一种方法是使应用程序特定的组件/服务依赖于这三个组件并使用它们来执行列出的操作。然后控制器仅依赖于此组件。

答案 1 :(得分: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();
    }
}

控制器根本没有做任何事情。它为用户提供控制流程。现在,请考虑将此依赖项注入控制器:

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

these three posts中有关于使用interface + DI的一些很好的信息。

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