C# MVC:对于业务逻辑属于何处,是否有明确的答案?

C# MVC:对于业务逻辑属于何处,是否有明确的答案?,c#,asp.net-mvc,asp.net-mvc-4,model-view-controller,C#,Asp.net Mvc,Asp.net Mvc 4,Model View Controller,我目前正在尝试重构一个C#MVC应用程序,尽管我对该模式的经验有限。围绕着这一主题阅读,我似乎总是在最佳实践问题上错误地接受相反的观点 我最大的问题是控制器里的东西太多了。它们可以工作,但它们充满了难以重组和测试的业务逻辑。模型大多只是薄型DTO。那么,我应该从哪里开始将这些有用的业务逻辑放在哪里,以便对其进行返工和测试呢 很多人说应该这样做。但后来有人说应该这样做。其他人告诉你模型的原理是模式的基础 然后有人告诉你应该上第四类课,a。现在,我已经在WPF中研究过MVVM,并且熟悉这个范例。但将

我目前正在尝试重构一个C#MVC应用程序,尽管我对该模式的经验有限。围绕着这一主题阅读,我似乎总是在最佳实践问题上错误地接受相反的观点

我最大的问题是控制器里的东西太多了。它们可以工作,但它们充满了难以重组和测试的业务逻辑。模型大多只是薄型DTO。那么,我应该从哪里开始将这些有用的业务逻辑放在哪里,以便对其进行返工和测试呢

很多人说应该这样做。但后来有人说应该这样做。其他人告诉你模型的原理是模式的基础

然后有人告诉你应该上第四类课,a。现在,我已经在WPF中研究过MVVM,并且熟悉这个范例。但将其添加到MVC似乎只是复制了其他地方所做的大量工作,没有比盲目遵循模式更好的理由了

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


是否有一个明确的“正确”答案?如果是这样,为什么会有这么多的困惑?如果没有,您如何在这种意见的泥潭中衡量最佳解决方案?

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

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

此业务逻辑属于服务,服务可以是使用WCF公开的远程服务,也可以是web API,也可以只是web站点中包含方法的类库

因此,总结如下:

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

  • 我不相信有一个明确的“正确”答案。我相信这都是你的偏好,你的数据操作有多复杂

    在我的公司,我们使用助手类/a服务进行组织。我们的控制器不包含任何功能,除了接收模型、操纵模型并将其吐回视图

    我们有大量的数据操作,在控制器中这样做将是一个可怕的混乱


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

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

    和我之前的项目一样,我工作的地方都在控制器中,必要时分解成更小的共享助手


    我认为没有严格意义上的正确方法或错误方法。大多数情况下,这似乎取决于开发商的个人偏好

    谢谢你的建议。我在这个问题中讨论的最后一种方法就是为此建立类库。考虑到这些类中的许多函数不会在其他地方使用,这在代码重用方面不是很浪费吗?不,我甚至建议针对接口编程,这样可以方便地模拟服务(测试目的等)。这是一个有价值的抽象概念;最有可能的是,一些服务操作将在各种控制器中重用。您似乎错过了最重要的一个:服务。这就是全部内容:将业务逻辑抽象为单个责任服务,这些服务可以很容易地从彼此和控制器中分离(并注入)测试。我强烈建议您阅读并理解它是如何在复杂应用程序的上下文中结合在一起的。您是否查看了CQRS模式?基本上你的控制器也可以是哑的。将命令传递给知道如何执行这些命令的处理程序,对于查询也是如此。