如何构建企业MVC应用程序,以及Business Logic在哪里?

Jam*_*mes 37 architecture model-view-controller asp.net-mvc

我是MVC的新手.据我所知:

  • 控制器:处理路由请求
  • 查看:处理数据的呈现
  • 模型:看起来很像数据访问层

业务逻辑在哪里?

获取大型企业应用程序:

  • 几个不同的数据源(WCF,WebServices和ADO)在数据访问层(使用多个不同的DTO)中连接在一起.
  • 很多业务逻辑分为几个dll.

MVC Web应用程序在此基础上(在代码和项目结构方面)的适当方式是什么?

我已经看到模型文件夹中的所有内容的示例似乎不适合非常大的应用程序.

谢谢你的建议!

Set*_*son 26

在我的应用程序中,我通常会创建一个与Web项目分开的"Core"项目.

核心项目包含:

  1. 业务对象,例如实体等
  2. 数据访问
  3. 任何不是专门为网络设计的东西

Web项目包含:

  1. 控制器,将请求从UI路由到核心逻辑
  2. 视图,侧重于以HTML格式呈现数据
  3. View Models,它将核心业务对象展平/转换为更简单的结构,旨在支持特定的视图

这里的关键点是基于Web的模型文件夹/命名空间仅用于特定于表示的模型,这些模型记录了给定视图所需的特定变量.尽可能多的"业务逻辑"进入核心项目.

  • 哇.8个答案,40分钟内有多条评论 - 必须是某种记录!感谢所有人的大力投入.这个特殊的答案(特别是ViewModels的使用)对我来说很有意义,所以我把它标记为答案. (2认同)

Pat*_*her 15

M odel V iew C ontroller听起来像它解决了你的3层,但事实并非如此.它确实组织了UI的组合方式.所述控制器是在中间,并且通常(A)不使用的东西 usiness对象和(B)从 usiness对象获取中号 Odel等对象传递到V IEW.系统的MVC部分(UI功能)不知道业务层的另一端发生了什么.D B?服务电话?磁盘IO?射击激光器?那么,MVC-B-?将是一个描述MVC的缩写,以及它如何连接起来.

想想中心的C ontroller,一条线向下B usiness对象.控制器通常会得到一个中号从Odel等 usiness对象传递关闭的V IEW,但中号 Odel等仅仅是数据.这是关键.从某种意义上说,C ontroller现在是系统中最聪明的部分,但B usiness对象仍然是最强大的.

因此,M odel对象是C ontroller和B usiness对象之间通信的很大一部分.此外,每个视图具有VM(V IEW 中号 Odel等)物体,它需要,这可能是一个中号 Odel等,但也可以是由构建的东西Ç ontroller到的信息更复杂的集传递到V IEW.

因此,控制器(1)从客户端获取数据并使用业务对象(如果需要)进行处理,可能使用模型对象进行通信,然后(2)从B usiness对象获取M odel 对象(s) ,构造一个VM,并将其提供给一个视图(可能是几个)进行渲染.

起初它看起来像是层和层,特别是因为进入MVC是增加接口使用(参见最后3或4个Solid主体)和单元测试的好时机.您可能在项目中拥有的文件数量超过了其他文件.很快,虽然你看到这实际上是组织事物的好方法.

作为系统的这个"顶层"部分,即MVC部分,我们不关心M odel对象是如何构造的,也不关心B usiness对象对它们的作用.如果您的Customer模型对象看起来很像您的Customers数据库表,那么当然不要感到惊讶!这是正常和常见的.但是,您的客户M odel对象和您的客户B usiness对象将真正具有不同的生命.现在是考虑存储库模式的好时机.

打击懒惰的诱惑,并在C ontroller中加入大量逻辑.随时努力将关注点放在他们下面的地方.该Ç ontroller只是布线的事情了.如果为了构建一个足够的VM供视图使用,需要大量的代码,这是可以的,因为这是控制器的工作.您经常在控制器中看到业务逻辑或渲染逻辑.把它放在它所属的地方!

我试图平衡全面性和简洁性,但你提出了一个很大的问题!

  • 很好的答案,但我发现难以阅读突出显示的首字母缩略词之间的空格,但我知道你为什么这样做,因为大胆的标签被解析(严重!).括号用粗体围绕字母怎么样?例如[**V**] iew (6认同)
  • 这对于所有括号来说真的很难阅读. (6认同)

Max*_*oro 9

MVC不是一个满足您需求的完整架构,它仅涵盖表示层.您的控制器应该与业务层和模型对象进行对话.业务层可以与其他层进行通信,例如数据库访问,Web服务,文件系统等.