Model view controller 在MVC/MVP/MVPC中,您将业务逻辑放在哪里?

Model view controller 在MVC/MVP/MVPC中,您将业务逻辑放在哪里?,model-view-controller,mvp,puremvc,Model View Controller,Mvp,Puremvc,在MVC/MVP/MVPC设计模式中,您将业务逻辑放在哪里?不,我不是指ASP.NETMVC框架(也称为“标签汤”) 有人说你应该把它放在MVC/MVPC的“控制器”或“演示器”中。但是,其他人认为,这应该是模式的一部分 你怎么想?为什么?我就是这么看的: 控制器用于应用逻辑;特定于应用程序希望如何与其所属知识领域交互的逻辑 该模型用于独立于应用程序的逻辑。i、 e.在其所属知识领域的所有可能应用中有效的逻辑 因此,几乎所有业务规则都将在模型中 当我需要决定在何处放置一些逻辑时,我会问自己一个有

在MVC/MVP/MVPC设计模式中,您将业务逻辑放在哪里?不,我不是指ASP.NETMVC框架(也称为“标签汤”)

有人说你应该把它放在MVC/MVPC的“控制器”或“演示器”中。但是,其他人认为,这应该是模式的一部分

你怎么想?为什么?

我就是这么看的:

控制器用于应用逻辑;特定于应用程序希望如何与其所属知识领域交互的逻辑

该模型用于独立于应用程序的逻辑。i、 e.在其所属知识领域的所有可能应用中有效的逻辑

因此,几乎所有业务规则都将在模型中


当我需要决定在何处放置一些逻辑时,我会问自己一个有用的问题:“这是否总是正确的,或者只是针对我当前正在编写的应用程序的一部分?”

我认为它不属于控制器,因为一旦它嵌入到控制器中,就无法取出

我认为MVC应该在两者之间注入另一层:映射到用例的服务层。它包含业务逻辑,了解工作单元和事务,并处理模型和持久性对象以完成其任务

控制器有一个对服务的引用,它需要满足其用例。它担心将请求解组到服务可以处理的对象中,调用服务,并封送响应以发送回视图

通过这种安排,即使没有控制器/视图对,服务本身也是可用的。它可以是控制器处理的本地或远程对象,可以按照您希望的方式进行打包和部署

控制器现在与视图的绑定更加紧密。毕竟,用于桌面的控制器可能与用于web应用的控制器不同


我认为这种设计更面向服务。

你可以把它放在两个地方。表示层中的控制器和。通过在表示层中使用一些逻辑,您可以限制返回体系结构的请求数量,从而增加系统负载。是的,您必须编写两次代码,但有时这正是响应用户体验所需要的

我有点喜欢这里说的()

“使用MVPC,MVP模型的演示者组件分为两部分
组件:演示者(视图控制逻辑)和控制器(抽象目的控制逻辑)。“

我使用ASP.NET MVC应用程序结构的方式工作流如下所示:

控制器->服务->存储库


上面的服务层是所有业务逻辑发生的地方。如果将业务逻辑放在控制器层中,您将失去在其他控制器中重新使用该业务逻辑的能力。

无论如何,请将其放在模型中


当然,一些用户交互必须在视图中,这将与您的应用程序和业务逻辑相关,但尽可能避免这种情况。具有讽刺意味的是,遵循用户在GUI中“工作”时尽可能少做的原则,以及在“提交”或操作请求期间尽可能多做的原则,可以获得更好的用户体验和可用性,而不是相反。至少对于业务线应用程序

将您的业务逻辑放在域中,并保持域的独立性。我更喜欢Presenter->Command(消息命令使用NServiceBus)->Domain(具有BC绑定上下文)->EventStore->EventHandler->Repository(读取模型)。若逻辑不适合域,那个么使用服务层

请阅读马丁·福勒、埃里克·埃文、格雷格·杨和乌迪·达汉的文章。他们有一幅非常清晰的图画


以下是Mark Nijhof撰写的文章:

+1:用户界面是视图/控制器——它会发生变化。模型是本质,这是合理的建议。但是,当您有多个视图依赖于同一业务逻辑时,您希望避免在两个控制器/演示器中重复该逻辑。在给定示例中,我将PDF视为“强制”和人为的,用于拆分演示器和控制器逻辑。我发现在视图代理立即控制演示者的位置中给出的解释更合适,与执行的操作相关的GUI更改被封装在“与操作相关的UI更改方法”中,并在操作完成后调用。仅供参考,我将此处引用的文章移到这里。Cheers Martin。@Kevin当你说服务层时,你的字面意思是像WCF/数据服务/等中的SOA吗。?或者它只是实现为更多的代码/类,位于控制器和存储库之间?@AaronLS我指的是位于控制器和存储库之间的另一个项目。在这种情况下,存储库是什么意思?这是你的模型层吗?我认为你的问题缺少一些背景。你是说MVC是作为一种应用程序范围的模式还是作为一种用户界面模式?这篇文章的链接已经不存在了。@Celdor请使用web.archive.org——就像10年后的回复一样。我仍然经常面对巨大的模型和/或巨大的控制器,它们的代码不能重复使用和紧密耦合。MVC让很多事情变得更好,但它似乎在某种程度上阻碍了人们的发展。