如何构build企业MVC应用程序,以及Business Logic到哪里去?

我是一名MVC新手。 据我所知,

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

业务逻辑去了哪里?

采取以下大型企业应用程序:

  • 几个不同的数据源(WCF,WebServices和ADO)绑定在一个数据访问层(使用多个不同的DTO)。
  • 很多业务逻辑分割成多个dll。

什么是MVC Web应用程序的最佳方式(从代码和项目结构)?

我已经看到了所有刚才在Model文件夹中的例子,看起来并不适合于非常大的应用程序。

感谢您的任何build议!

在我的应用程序中,我通常创build一个独立于Web项目的“Core”项目。

核心项目包含

  1. 业务对象,如实体等
  2. 数据访问
  3. 任何不是专门为网页devise的

Web项目包含

  1. 控制器 ,将来自UI的请求路由到核心逻辑
  2. 视图 ,重点是在HTML中呈现数据
  3. 查看模型 ,将核心业务对象扁平化/转换为旨在支持特定视图的更简单的结构

这里的关键是基于Web的Models文件夹/名称空间仅用于特定演示文稿模型,用于logging给定视图所需的特定variables。 尽可能多的“业务逻辑”进入核心项目。

[ M ] odel [ C ] ontroller听起来像是在处理你的3层,但事实并非如此。 它确实组织如何把你的用户界面放在一起。 控制器在中间,通常(A)使用[ B ]可用性对象,而(B)从[ B ]使用对象获取[ M ]对象传递给[ V ]查看器。 系统的MVC部分(UIfunction)不知道业务层的另一端发生了什么。 D B? 服务电话? 磁盘IO? 射击激光? 那么, MVC-B-? 将是一个描述MVC 它如何挂钩的首字母缩略词。

想一下中间的[ C ]控制器,并且有一条线条向下延伸到[ B ]可用性对象。 控制器通常从[ B ]可用性对象中获取[ M ] odel以传递给[ V ]查看器,但[ M ] odel只是数据。 这是关键。 从某种意义上说,[ C ]控制器现在是系统中最聪明的部分,但[ B ]可用性对象仍然是最强大的。

所以,物体是[ C ]控制器和[ B ]物体之间通信的重要组成部分。 此外,每个视图都有一个VM ([ V ] view [ M ] odel)对象,它可能是[ M ] odel,但可能是由[ C ]控制器构造的,用于将更复杂的信息传递给[ V ]查看。

因此,一个控制器( 1 )从客户端获取数据,并用业务对象(如果需要的话)进行处理,或许使用模型对象进行通信,然后( 2 )从[ B ]用途中获取[ M ]对象,构造一个虚拟机 ,并将其提供给一个视图(可能有几个)来渲染。

起初,它真的会像层层叠叠,特别是因为进入MVC是增加使用接口(参见最后3或4个固体主体 )和unit testing的好时机。 您的项目中可能会有更多的文件比您以前的文件更多。 尽pipe你很快就会发现,这实际上是组织事物的一个好方法。

作为MVC系统的“顶级”部分,我们根本不在乎如何构build这些对象,也不在乎它们是如何对待它们的。 当然,如果你的客户模型对象看起来很像客户数据库表,那么不要感到惊讶! 这是正常的和常见的。 但是,您的客户对象和您的客户对象实际上将有不同的生命。 现在是考虑版本库模式的好时机。

防止诱惑懒惰,并把大量的逻辑到[ C ]的ontroller。 力求每一刻都把关切放在他们下面的地方。 [ C ]的ontroller只是为了布线。 如果为了构build一个足够的虚拟机来使用视图,需要大量的代码,这是可以的,因为这是控制器的工作。 您经常会在控制器中看到业务逻辑或渲染逻辑。 把它放在它所属的地方!

我试图平衡综合性,但是你问了一个很大的问题!

MVC并不是一个完整的架构来满足您的需求,它只包含表示层。 您的控制器应该与业务层交谈,取回模型对象。 业务层可以与其他层进行交stream,如数据库访问,Web服务,文件系统等。

我倾向于将我的业务逻辑放在服务中,并从控制器调用它们,然后将数据封送到相应的服务中。

要有一个MVC应用程序坐在上面,我会使用一个门面模式或类似的东西,来代理调用你现有的业务逻辑。 因此,您的服务本质上只是将数据传递给现有的业务逻辑。

这样,现有的业务逻辑和新的基于MVC的代码之间就有一个干净的分界线。

“这取决于” :)

请求被路由到控制器,适当地处理它们。 控制器是把所有其他东西(模型,视图等)放在一起的“粘合剂”。 所以很自然地,“业务逻辑”将被直接处理或由控制器卸载到另一个组件。

你究竟把逻辑放在哪里取决于你的需求。 如果只有一个控制器需要逻辑,那么把它直接放在一个控制器内就可以了。 当然,如果数据一致性需要逻辑,逻辑也可能进入单一模型。

或者,您可以将逻辑放在助手类/函数中,或者(如其他人所提到的),您可以为业务逻辑创build一个服务层。

您可以使用S#arp体系结构使用最佳实践正确地构build您的应用程序。 有一个全面的示例应用程序在谁可以帮助我?

也许这个链接将帮助你更好地理解模型。 他们可以扮演数据传输对象的angular色,或者更深入地描述链接。 但是,我认为他们不应该是你的DAL。 我看到的许多示例都使用服务和存储库模式处理业务逻辑和DAL。

检查MVC Contrib项目和代码阵营样本来得到一个这样的例子。

我还发现了Rob Conery的电子商务店面和Northwind MVC入门套件 。

海事组织这种情况下更适合像你在WPF中使用的东西。 ViewModel视图控制器。

您的控制器与在域对象上执行function的业务服务进行通信。 控制器将从业务服务返回的数据(如果需要组合)转换为视图模型(MVC中的“M”)。 视图模型然后传递给视图。

反过来,从视图中取出虚拟机并将数据发送回业务服务