C# MVC:将业务逻辑放在哪里?

C# MVC:将业务逻辑放在哪里?,c#,asp.net-mvc,model-view-controller,business-logic,C#,Asp.net Mvc,Model View Controller,Business Logic,首先,我看到了很多关于这一点的问题,但没有足够的理由。如果我的问题不够好,应该删除,我会理解的 举个例子,我看了一下,一个45%以上的支持率回答说,他建议您将业务逻辑放在模型中,这听起来很合乎逻辑 然而,我的第一个大型项目是在控制器中使用所有BL完成的,因为我没有质疑这些事情,而是查看了如何在AccountController中完成,如果您选择带表单身份验证的MVC,它将自动添加。所有的方法看起来都塞满了BL。或者可能是添加的代码量最少,而我忽略了一些东西 youtube上的一个人问我,他把所有

首先,我看到了很多关于这一点的问题,但没有足够的理由。如果我的问题不够好,应该删除,我会理解的

举个例子,我看了一下,一个45%以上的支持率回答说,他建议您将业务逻辑放在模型中,这听起来很合乎逻辑

然而,我的第一个大型项目是在控制器中使用所有BL完成的,因为我没有质疑这些事情,而是查看了如何在
AccountController
中完成,如果您选择带表单身份验证的MVC,它将自动添加。所有的方法看起来都塞满了BL。或者可能是添加的代码量最少,而我忽略了一些东西

youtube上的一个人问我,他把所有的逻辑都放进了他的模型中,这是否正确,起初我是否定的!然后我开始想也许他是对的


那么,归根结底,我应该把业务逻辑放在哪里?如果它在模型类中,那么在控制器中的方法中,有多少代码应该被认为是健康的?最多一行从控制器中的模型调用某个方法,然后返回视图?

我喜欢保持模型干净,即只使用属性而不使用业务逻辑。我一直认为将依赖项注入控制器是好的,这些依赖项包含我在模型上执行的逻辑。我喜欢在可能的情况下坚持单一责任原则,我发现有大量方法的模型很快就会膨胀。两者都有优点和缺点,注入大量依赖项会带来开销,但允许单独测试并保持类的简单性,最终会得到更精简的控制器。尽管我的逻辑并没有作为类的成员实际存在于我的模型中,但它仍然是业务逻辑。我倾向于不在控制器中定义业务逻辑,因为模仿Httpcontext之类的东西有点像噩梦,没有必要。

业务逻辑属于问题域,属于问题域的所有东西都属于MVC中的模型

控制器应负责将数据从模型传递到视图,并从视图返回到模型。因此,控制器是用户交互对象与程序如何建模和存储问题状态之间的桥梁。可以说,管道系统


这里的关键是业务逻辑和管道逻辑之间的区别。在我看来,自动生成的帐户控制器所做的主要是管道,而不是真正的业务逻辑。请记住,管道逻辑并不一定很短,因此您不需要施加人为限制(如“控制器中最多有X个调用”)。

出于几个原因,我更喜欢将域逻辑放在模型中

  • 模型中应该没有UI代码,因此更容易测试。只要有可能,在编写任何UI代码之前,我都希望有一个完全工作(意味着完全的测试覆盖)的模型。控制器可以相信模型正在做正确的事情,并且只处理UI问题

  • 如果将域逻辑放在控制器中,那么在不同的应用程序之间,甚至在不同的控制器之间共享就不那么容易了


  • 我也喜欢保持我的模型干净(参考:@markwalsh)。无法重用控制器中嵌入的逻辑的问题可以通过依赖注入轻松解决,或者,如果您认为依赖注入太多,可以通过接口公开您的业务/域逻辑,并在控制器中使用façade模式。这样,您可以获得所需的功能,但同时保持控制器和模型的整洁。

    我也希望保持模型的整洁。MVC控制器应仅用于拨打电话,还应保持清洁。因此,根据其可重用性、敏感性和相关性,业务逻辑可以用

    1.WebApi控制器:使用WebApi控制器的优点是,您可以在以后将这些作为服务公开给其他设备,从而使代码可重用。

    2。BAL/Common Comment:有些逻辑具有特定用途,不能作为api公开,可以在此类中推送。


    3。存储库:所有与数据库相关的查询都添加到存储库中。可以有一个通用存储库来实现所有功能(CRUD操作)或每个表的特定存储库。取决于要执行的操作。

    我的团队在从webforms(asp.net)迁移到mvc时做了大量的研究,并提出了以下结构。在我看来,这与应用程序的大小无关。它是关于保持代码的干净和清晰

    DALProject

    AccountsDAL.cs --- > Calls SP or any ORM if ur using any
    
    Model
        AccountsModel --- > Contains properties And call BLL
    Controllers
        IndexController ---> Calls Models and returns View
    Views
        Index
    
    BLLProject

    AccountsBLL.cs ---> Calls DAL
    
    WebProject

    AccountsDAL.cs --- > Calls SP or any ORM if ur using any
    
    Model
        AccountsModel --- > Contains properties And call BLL
    Controllers
        IndexController ---> Calls Models and returns View
    Views
        Index
    

    控制器应负责在模型和视图之间传递数据。除此之外,不应该有任何不必要的代码。例如,如果您正在记录日志,那么它应该在模型级别而不是控制器级别完成。

    我知道这是一个关于MVC的问题,但我认为我给出的示例(Web API)将是有用的

    我正在开发我的第一个Web API,并且正在使用来自其他应用程序的业务逻辑。具体地说,它来自一个外部DLL,所以我的API只用于与SAP解决方案“对话”,从PO接收请求并发送响应

    如何将我的逻辑(已实现)放入控制器?我不需要它。我的控制器将只接收、验证请求并编写响应以发送回数据

    我正在使用ViewModel类,它们必须具备的只是一个映射函数,用于从TransferObjects(来自