当前位置:  开发笔记 > 后端 > 正文

ASP.NET MVC - 控制器中是否应存在业务逻辑?

如何解决《ASP.NETMVC-控制器中是否应存在业务逻辑?》经验,为你挑选了5个好方法。

Derik Whitaker 几天前发表了一篇文章,这篇文章引起了我一直好奇的一段时间:控制器中是否存在业务逻辑?

到目前为止,我见过的所有ASP.NET MVC演示都将存储库访问和业务逻辑放在控制器中.有些甚至在那里抛出验证.这会导致相当大的膨胀控制器.这真的是使用MVC框架的方式吗?看起来这最终会导致很多重复的代码和逻辑分散在不同的控制器上.



1> jonnii..:

业务逻辑应该真的在模型中.你应该瞄准脂肪模型,瘦的控制器.

例如,而不是:

public interface IOrderService{
    int CalculateTotal(Order order);
}

我宁愿:

public class Order{
    int CalculateTotal(ITaxService service){...}        
}

这假定税收由外部服务计算,并要求您的模型了解外部服务的接口.

这将使您的控制器看起来像:

public class OrdersController{
    public OrdersController(ITaxService taxService, IOrdersRepository ordersRepository){...}

    public void Show(int id){
        ViewData["OrderTotal"] = ordersRepository.LoadOrder(id).CalculateTotal(taxService);
    }
}

或类似的东西.



2> AlejandroR..:

我喜欢Microsoft Patterns&Practices提供的图表.我相信谚语"一张图片胜过千言万语".

该图显示了MVC和业务服务层的体系结构


那真的很有用!你能告诉我你在那个网站上找到这张图吗?
这是来自微软的"服务器端实现"http://msdn.microsoft.com/en-us/library/hh404093.aspx

3> Joe Soul-bri..:

这是一个引人入胜的问题.

我认为有趣的是,大量的示例MVC应用程序实际上无法遵循MVC范例,因为它真正将"业务逻辑"完全置于模型中.Martin Fowler指出,MVC不是四人帮意义上的模式.相反,程序员必须添加模式才能创建超出玩具应用程序的东西.

因此,简短的回答是"业务逻辑"确实不应该存在于控制器中,因为控制器具有处理视图和用户交互的附加功能,并且我们想要创建只有一个目的的对象.

更长的答案是,在将逻辑从控制器移动到模型之前,您需要考虑模型层的设计.也许您可以使用REST处理所有应用程序逻辑,在这种情况下,模型的设计应该相当清楚.如果没有,您应该知道将使用什么方法来防止模型变得臃肿.



4> Leniel Macca..:

您可以查看Stephen Walther撰写的这个精彩教程,其中显示了使用服务层进行验证.

了解如何将验证逻辑移出控制器操作并进入单独的服务层.在本教程中,Stephen Walther解释了如何通过将服务层与控制器层隔离来保持关注点的明显分离.


这是最正确的答案.我个人进一步提倡不向控制器公开服务,而是选择使用ViewModel概念,例如MVVM模式中的概念.想象一下,您希望使用桌面界面(例如,Windows窗体或WPF)以及Web界面编写业务应用程序.解决这个问题会让你进入"瘦调控制器"模式,这里也提到了这种模式.底线:永远不要将业务逻辑放在模型或控制器中,也不要将任何东西放在你没有的控制器中.

5> 小智..:

业务逻辑不应包含在控制器中.控制器应该尽可能的瘦,理想情况下遵循模式:

    查找域名实体

    域名实体法案

    准备查看/返回结果的数据

另外,控制器可以包含一些应用逻辑

那么我在哪里放置我的业务逻辑呢?在模型中.

什么是模特?现在这是一个很好的问题.请参阅Microsoft模式和实践文章(感谢AlejandroR的优秀发现).在这里有三类模型:

视图模型:这只是一个数据包,具有从视图传递数据到视图的最小(如果有)逻辑,包含基本字段验证.

域模型:具有业务逻辑的胖模型,对单个或多个数据实体(即给定状态中的实体A而非实体B上的操作)进行操作

数据模型:存储感知模型,单个实体中包含的逻辑仅与该实体相关(即,如果字段a则为字段b)

当然,MVC是一种不同种类的范例.我在这里描述的只是MVC占据顶层,在维基百科上看这篇文章

今天,MVC和类似的模型 - 视图 - 展示器(MVP)是分离关注设计模式,它们专门适用于更大系统的表示层.在简单的场景中,MVC可以代表系统的主要设计,直接进入数据库; 但是,在大多数情况下,MVC中的Controller和Model对服务或数据层/层都有松散的依赖性.这完全是关于客户端 - 服务器架构

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有