控制器层中应允许多少业务逻辑存在?


39

有时,我们的应用程序的控制器代码中表示了一些业务逻辑。通常,这是区分从模型调用什么方法和/或传递它们的参数的逻辑。

另一个示例是控制器中存在的一组实用程序功能,这些功能可以根据一组业务规则来格式化或清除从模型返回的数据。

这行得通,但我想知道它是否在灾难中调情。如果控制器和模型之间共享业务逻辑,则这两层将不再可分离,并且继承代码的人员可能会因与业务逻辑相关的代码位置不均匀而感到困惑。

我的问题是,控制器中应允许多少业务逻辑,以及在什么情况下(如果有)?


1
好问题。我期待看到人们的意见。
内森·泰勒

Answers:


20

理想情况下没有

但这并不总是可能的。我不能给您20%或10行这样的硬数字,这取决于无法回答的问题。我可以描述一下我如何使用需要稍微弯曲的设计模式和环境。

在我看来,这完全取决于应用程序的目的。构建一个简单的REST API来发布?忘记干净的分离甚至图案。您可以在不到一个小时的时间内推出工作版本。建立更大的东西?大概最好去做。

目标是构建单独包含的系统。如果您开始编写特定于两个系统如何交互的业务逻辑,那将是一个问题。如果不深入研究,我无法给出意见。

设计模式是模子,有些人喜欢在主要和写得很好的代码的基础上严格遵守它们。严格遵守模式可能不会给您不好的代码,但是可能会花费更多时间并导致您编写更多代码。

设计模式是灵活的,调整它们以满足您的需求。过度弯曲它们,尽管它们破裂。知道您需要什么,然后选择最接近的设计模式。


10

尽可能少。最好没有。

控制器应关注接受请求,请求正确的域服务来处理请求以及将响应移交给正确的视图。

在此过程中,所有“业务逻辑”都应存在于域服务中。

如果您具有可以使用域对象并从中创建视图模型的功能,则可以与控制器合理地共存。但这应该是出于相应视图的目的而存在的代码。如果存在有关数据清理的业务级别规则,则该规则应存在于您的域/服务级别(带有适当的单元测试)。


10

术语“业务逻辑”经常引起混淆,因为人们对此有不同的看法。我认为,术语“业务逻辑”涵盖两个领域

  • 领域逻辑
  • 应用逻辑

域逻辑是与业务相关的核心领域相关的逻辑,因此,如果为会计师编写应用程序,则税法,簿记规则等都是域逻辑的一部分。

应用程序逻辑是与您正在运行计算机程序的事实有关的逻辑。这可以是诸如CSV导入导出,向导等之类的内容。还可以包含诸如创建忘记密码的电子邮件之类的内容。

您可以在控制器层中放置的“业务逻辑”是应用程序逻辑。也许不是所有的应用程序逻辑都应该放在那儿。但是永远不要将域逻辑放在控制器层中。那显然应该在域层中。

您在谈论格式化或清理数据的逻辑。格式一定是应用程序逻辑。另一方面,如果清理数据基于域规则,则清理可能是领域逻辑。这取决于上下文。


4

控制器应该对域逻辑非常了解。

控制器应委派任务,例如通过抽象服务/存储层从数据存储中检索记录,以及通过相同(或相关)服务将数据传递回数据存储中。至于这些操作之间的机制和更精细的工作,通常它们属于控制器以外的其他位置。

我经常发现自己在控制器中添加了小型数据清理方法,这些方法将数据保存回存储中,尽管这是一种有效的解决方案,但它与控制器的预期作用并不匹配。理想情况下,任何将要修改,验证或解析模型的事物都应在模型本身附近(如果不在模型内部)发生。例如,如果您需要在存储之前“清理”模型对象,请考虑在模型上或作为处理存储模型的服务的一部分使用SanitizeInputs()方法。


3

从务实的角度来看,我发现,当您尝试做某种没有良好的模式兼容方法的事情时,您要么在控制器中遇到逻辑,要么在模型中出现控制器行为。令人怀疑的是,如果您要编写的应用程序背后没有大型基础架构。

您可以选择任一种方式,但我通常会尝试考虑是否在多个控制器动作中出现怪异的现象,如果出现在模型中。如果不清楚,我尝试考虑它是否更适合某个地方而不是另一个地方。我通常将其放在模型中只是为了使其不受控制器影响(个人偏爱较小的控制器和更强大的数据对象,YMMV)而失败

第三种选择是将实用程序项引用为单独的实用程序类,但是在许多人看来,这也与模式不符。

另外,仅仅因为您没有严格遵循模式,您不一定就在灾难中调情。除非您真的希望这个项目重用大量代码,否则我会更加担心该项目与自身的一致性(即:一旦选择一个位置,不要在放置这些位的位置上翻转)而不是出于某种原因想要节省项目中间部分的重写。记录/注释您偏离普通模式的位置以及原因,并为此应用程序定义期望的模式。

MVC在某一点上偏离既定模式本身。


3

像编程中许多其他有趣的概念一样,MVC是一种强大的范例,可以将结构和焦点集中在一系列紧密或相似的策略上,以实现特定的场景。

像许多其他编程概念一样,MVC简化了现实,丢弃了很小的细节,并提供了可遵循的粗略线框模型。像对现实的许多其他简化一样,它确实可以使人为的结构陷入混乱。

但是,像许多其他编程概念一样,MVS只是现实的简化。这不是完美的,也不是彻底的。这就是为什么不可能将现实世界中的情况放入过于简化的模型中的原因。因此出现了许多与此类似的问题。

  • 控制器应加入多少逻辑?

  • 视图是否应包含任何条件逻辑?

  • 模型是否应包含未在业务实体中直接找到的其他数据?

这些都是为了调整代码以准确,完全地适应MVC概念而产生的问题。

我对你的回答是不要尝试。MVC提供了结构。在此基础上构建应用程序,但不要期望它完全适合。会有偏差,这是正常现象。只要注意保持他们的控制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.