ASP.NET MVC - 业务逻辑是否应该存在于控制器中?
Derik惠特克发布了一个article几天前袭击,我一直好奇一段时间点的:应业务逻辑控制器存在?ASP.NET MVC - 业务逻辑是否应该存在于控制器中?
到目前为止,所有的ASP.NET MVC演示我见过控制器把仓库的访问和业务逻辑。有些人甚至会在那里进行验证。这导致相当大,臃肿的控制器。这真的是使用MVC框架的方式吗?看起来,这只会导致很多重复的代码和逻辑遍布不同的控制器。
业务逻辑应该真的在模型中。你应该瞄准肥胖模型,瘦骨controllers controllers的控制器。
。例如,而不是:
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);
}
}
或类似的东西。
那么你会注入服务到您的控制器而不是存储库吗?在这种情况下,工作单位原则如何发挥作用? – 2008-10-24 21:01:24
我写了更多的东西,我希望这更有意义。 你可能想也看过: http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model 尽管这是Rails的它仍然是非常适用的。 – jonnii 2008-10-24 21:12:11
我会亲自调用一个仓库服务。 – 2008-10-25 00:49:21
这是一个有趣的问题。
我认为它有趣的是,大量的样品MVC应用程序实际上无法按照真正放置“商业逻辑”完全在模型意义上的MVC模式。马丁福勒指出,MVC不是四人帮的意义上的模式。相反,如果程序员在玩具应用程序之外创建某种东西,则必须将添加到,这是范例。因此,简短的回答是,“业务逻辑”实际上不应该存在于控制器中,因为控制器具有处理视图和用户交互的附加功能,并且我们希望仅以一个目的创建对象。
较长的答案是,你需要把一些思想到您的模型层的设计刚刚从控制器移动逻辑模型前。也许你可以使用REST处理所有的应用逻辑,在这种情况下,模型的设计应该相当清晰。如果没有,你应该知道你要用什么方法来防止模型变得臃肿。
您可以检查由斯蒂芬·瓦尔特这真棒教程,显示Validating with a Service Layer。
了解如何将您的验证 逻辑移出控制器动作 ,并成为一个单独的服务层。在 本教程中,Stephen Walther 解释了如何通过从您的 控制器层中分离 您的服务层来保持急切的关注点。
业务逻辑不应该被包含在控制器。控制器应该尽可能地瘦,最好按照图案:
- 查找域实体
- 域实体
- 准备视图/返回数据行为造成
另外控制器可以包含一些应用逻辑。
那么我在哪里放置业务逻辑?在模型中。
什么是模型?这是一个很好的问题。请参阅Microsoft Patterns and Practices article(荣获AlejandroR出色发现)。在这里有三大类车型:
- 视图模型:这是一个简单的数据包,以最少的,如果有的话,逻辑从和意见传递数据,包括基本的字段验证。
- 域模型:脂肪模型与业务逻辑,在单个或多个数据实体进行操作(即,在比实体B动作的给定状态的实体A)
- 数据模型:存储感知模型,逻辑包含在一个单独的实体中仅涉及该实体(即,如果字段a当时的字段b)
当然,MVC是一个范式来自不同的品种。我在这里描述的是MVC只占用顶层,韦迪this article on Wikipedia
今天,MVC和类似的模型 - 视图 - 演示者(MVP)是是专门适用于更大的系统的表现层的关注设计模式分离。在简单的场景中,MVC可能代表系统的主要设计,直接进入数据库;然而,在大多数情况下,MVC中的Controller和Model对服务层或数据层/层都有一个松散的依赖关系。这是关于客户端 - 服务器体系结构
如果您使用依赖注入器,您的业务逻辑将转到它们,因此您将得到整洁干净的控制器。
该文章的链接已死亡 - http://web.archive.org/web/20150906064521/http://devlicio.us/blogs/derik_whittaker/archive/2008/10/22/how-is-interacting -with-your-data-repository-in-your-controller-different-or-better-doing-doing-your-code-behind.aspx是archive.org的副本,供任何感兴趣的人使用。 – 2017-05-22 10:07:04