MVC:关于业务逻辑属于哪里,是否有明确的答案?

时间:2016-06-14 14:21:22

标签: c# asp.net-mvc asp.net-mvc-4 model-view-controller

我目前正在尝试重构C#MVC应用程序,尽管该模式的经验有限。围绕这个主题进行阅读,我似乎总是在对最佳实践的相反意见中犯错误。

我最大的问题是控制器中存在太多东西。它们有效,但它们充满了难以重组和测试的业务逻辑。模型大多只是瘦DTO。那么,我在哪里开始使用这个有用的业务逻辑来重做并测试它呢?

很多人说应该go in the model。但是你得到一些人说应该go in the controller after all。其他人告诉你,模型containing data and NOTHING ELSE的原理是模式的基础。

然后你会让人们告诉你它应该进入第四类,ViewModel。现在我已经在WPF中使用MVVM了,我熟悉这个范例。但是将其添加到MVC似乎复制了许多其他地方所做的工作,没有比盲目遵循模式指令更好的理由。

另一种选择是把它放在某种辅助类中。这似乎是一个常见的建议,我不会链接。但这样做似乎浪费了另一个类,除了向单个控制器提供函数之外没有任何意义。这似乎是对OOP原则的根本违反。

是否有明确的"正确的"回答这个?如果是这样,为什么会有这么多混乱?如果没有,你如何在这种观点中评估最佳解决方案?

3 个答案:

答案 0 :(得分:3)

对我来说,MVC中的M代表视图模型,它包含视图执行其工作所需的数据,因此视图可以尽可能保持愚蠢。

此视图模型在控制器中创建并传递给视图,但正如您所说,控制器逻辑应该保持较小 - 因此这里没有业务逻辑。

此业务逻辑属于服务 - 可以是使用WCF公开的远程服务,也可以是Web API,或者只是网站中包含方法的类库。

所以,总结一下:

  1. 控制器调用服务以模型的形式获取数据。业务逻辑在这些服务中,返回的模型只是POCO。
  2. 控制器根据收到的模型创建一个视图模型,该模型包含最适合视图的格式的属性。
  3. 控制器将视图模型传递给视图,该视图使用视图模型自行构建。

答案 1 :(得分:2)

我不相信有一个明确的“正确”答案。我相信这一切都是优先考虑的,你的数据操作有多复杂。

在我的公司,我们使用帮助类/服务来实现组织。我们的控制器不包含任何功能,除了接收模型,操作模型并将其吐回视图。

我们有大量的数据操作,并且在控制器中执行此操作将是一个可怕的混乱。

大多数人都会同意控制器中没有逻辑。区别在于逻辑应该在哪里。对于我的公司来说,将它放在模型中本身是荒谬的,因为发生了大量的操作。如果没有大量的操作,我会把它放在模型中。

答案 2 :(得分:1)

在我目前正在开展的项目中,我们将控制器合理地从业务逻辑中解放出来,因为我们已将它们分离为工作单元。我相信采用这种模式是为了让我们根据客户等交换工作单元。

我之前工作过的项目都在控制器中,并在必要时分解为较小的共享助手。

我认为没有严格的方法或不正确的方法。大部分时间似乎都取决于开发人员的个人偏好。