使用具有 3 层架构的 MVC 模式

Posted

技术标签:

【中文标题】使用具有 3 层架构的 MVC 模式【英文标题】:Using MVC Pattern With 3 Layer Architecture 【发布时间】:2012-12-31 22:01:35 【问题描述】:

我在我的应用程序中使用 ASP.NET MVC。我已将我的应用程序分为三层架构。 1)数据访问层(使用实体框架),2)应用程序/业务层,3)表示层(ASP.NET MVC)。

因为我在表示层上使用 MVC 框架,所以我对业务逻辑感到困惑。我需要知道在 MVC 模式中我的业务逻辑应该放在哪里。换句话说,我们可以说我需要从哪里调用我的中间层。来自模型还是来自控制器?

如果我从 Controller 调用我的业务逻辑,那么模型似乎没用。否则,如果我从模型中调用业务逻辑,那么在系统上似乎是不必要的,因为业务对象与模型进行映射,然后将模型传递给控制器​​。模型完全按照 DTO 所做的工作。

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

ASP.NET MVC 层或层既不包含业务逻辑也不包含业务模型。 M in MVC 代表 UI 模型,而不是应用程序核心的模型,MVC(以及其他 MV* 模式)通常是用于分离 UI 关注点的模式。您应该从控制器发送消息(调用)您的业务层 (BL)、聚合数据、创建或将其结果映射到 UI 模型并将其传递给视图。您的 UI 模型应该对 BL 模型一无所知 - 这种区别使您的应用程序的层松散耦合。

换句话说,我们可以说我需要从哪里调用我的中间层。 来自模型还是来自控制器?

绝对来自控制器。您将依赖项注入它并从您的 Action 方法中调用它们。 ASP.NET MVC 为控制器提供了许多注入依赖项的机制,并与 NInject、StructureMap 和一些其他 IoC 容器很好地集成。

MVC 中组件之间的依赖关系如下所示

图片取自 Martin 在 GUI Architecture 上的 Fowler 文章,顺便说一下,这篇文章非常适合阅读有关 MVC 和 MVP 的文章。

另外,Pluralsight 有一组关于软件实践的视频,其中涵盖了设计模式。我从他们对 MVVM 和 MVP 的定义中学到了很多东西。

阅读这些材料不仅可以增加您对模式本身的理解,还可以了解它们如何适应应用程序环境并与之交互。

【讨论】:

非常感谢伊利亚·伊万诺夫。你真的帮了我。我忘了问一件事,我们在哪里进行演示验证?在视图或控制器中。 您能否更详细地解释一下您所说的演示验证是什么意思?用户输入?它应该由控制器触发,但最好将逻辑放置在执行此验证的数据附近。所以模型似乎是一个好地方。但这可能因问题的上下文而异。 是的,我想验证用户输入。你说模型是一个好地方,但是客户端验证呢?如果我们将验证放在模型中,它需要回发,或者如果我们在两个地方都放置验证模型并查看代码被隔离在两个不同的地方,因为相同的问题可能会导致问题难以维护 是的,但是客户端在性能和环境上通常与服务器端有很大的不同,所以你仍然需要复制大量的验证片段。存在许多不同的方法,我个人建议使用约定进行验证。至少尝试一下。尝试实验 - 我不能说太多关于你的问题,因为我对此一无所知。【参考方案2】:

这纯粹是您必须根据自己的要求做出的设计/架构决定。

如果您想扩展您的应用程序以支持其他服务/应用程序,建议不要在 Controller/Model 中编写任何业务逻辑。您可以在业务/应用程序层中编写它。这将帮助您在未来扩展您的架构。假设您想为您的移动应用程序创建 RESTful 服务,您可以编写服务作为包装器以重用现有的业务/应用程序层。

也只需看看领域驱动设计,Eric Evans 的书值得一​​读。

http://dddsample.sourceforge.net/architecture.html

【讨论】:

以上是关于使用具有 3 层架构的 MVC 模式的主要内容,如果未能解决你的问题,请参考以下文章

MVC模式与三层架构的区别

浅析MVC模式与三层架构的区别

在具有 3 层架构的 ASP.NET MVC 应用程序中验证业务规则的更好方法是啥?

深入剖析 MVC 模式与三层架构

MVC三层架构详解

MVC 与 n 层架构