我目前正在尝试重构C#MVC应用程序,尽管该模式的经验有限。围绕这个主题进行阅读,我似乎总是在对最佳实践的相反意见中犯错误。
我最大的问题是控制器中存在太多东西。它们有效,但它们充满了难以重组和测试的业务逻辑。模型大多只是瘦DTO。那么,我在哪里开始使用这个有用的业务逻辑来重做并测试它呢?
很多人说应该go in the model。但是你得到一些人说应该go in the controller after all。其他人告诉你,模型containing data and NOTHING ELSE的原理是模式的基础。
然后你会让人们告诉你它应该进入第四类,ViewModel。现在我已经在WPF中使用MVVM了,我熟悉这个范例。但是将其添加到MVC似乎复制了许多其他地方所做的工作,没有比盲目遵循模式指令更好的理由。
另一种选择是把它放在某种辅助类中。这似乎是一个常见的建议,我不会链接。但这样做似乎浪费了另一个类,除了向单个控制器提供函数之外没有任何意义。这似乎是对OOP原则的根本违反。
是否有明确的"正确的"回答这个?如果是这样,为什么会有这么多混乱?如果没有,你如何在这种观点中评估最佳解决方案?
答案 0 :(得分:3)
对我来说,MVC中的M代表视图模型,它包含视图执行其工作所需的数据,因此视图可以尽可能保持愚蠢。
此视图模型在控制器中创建并传递给视图,但正如您所说,控制器逻辑应该保持较小 - 因此这里没有业务逻辑。
此业务逻辑属于服务 - 可以是使用WCF公开的远程服务,也可以是Web API,或者只是网站中包含方法的类库。
所以,总结一下:
答案 1 :(得分:2)
我不相信有一个明确的“正确”答案。我相信这一切都是优先考虑的,你的数据操作有多复杂。
在我的公司,我们使用帮助类/服务来实现组织。我们的控制器不包含任何功能,除了接收模型,操作模型并将其吐回视图。
我们有大量的数据操作,并且在控制器中执行此操作将是一个可怕的混乱。
大多数人都会同意控制器中没有逻辑。区别在于逻辑应该在哪里。对于我的公司来说,将它放在模型中本身是荒谬的,因为发生了大量的操作。如果没有大量的操作,我会把它放在模型中。
答案 2 :(得分:1)
在我目前正在开展的项目中,我们将控制器合理地从业务逻辑中解放出来,因为我们已将它们分离为工作单元。我相信采用这种模式是为了让我们根据客户等交换工作单元。
我之前工作过的项目都在控制器中,并在必要时分解为较小的共享助手。
我认为没有严格的方法或不正确的方法。大部分时间似乎都取决于开发人员的个人偏好。