MVC3应用程序/服务层/存储库层/ POCO类/ EF4 - 问题!

时间:2011-02-27 23:03:26

标签: entity-framework asp.net-mvc-3 repository-pattern poco service-layer

我是这个整体设计概念的新手,在过去几周的阅读中,我收集了大量信息,但它似乎分散且矛盾。条款喜忧参半,我只是很难想到这一点。

我使用的模式是这样的,并假设流程如下:

MVC申请
控制器处理来自客户端的给定视图的请求/响应。在控制器操作方法内部,它们联系服务(服务层),并请求对象构建视图模型,并从视图模型中检索对象。

查看模型
我在视图中使用强类型视图模型。

是视图模型DTO吗?它们应该只包含Name,AddressLine1,Address City等简单属性,还是应该包含复杂属性,多个对象等。

是视图模型中的验证。如果是这样,它将是必需的字段,字段长度等验证。然后验证用户名已经存在,或者您需要与服务层中的其他对象进行交互?

视图模型是否只包含从EF返回的POCO类,还是应该使用AutoMapper?

如果使用AutoMapper和DTO,DTO是POCO类的克隆吗?

您会在控制器,视图模型或下面的服务层中进行映射吗?

服务
对我来说,服务是与存储库联系以从EF获取POCO对象的对象。这就是我所有业务逻辑的所在。一旦服务将对象传递回存储库以持久保存到EF,它们就被视为有效对象。这是对的吗?

存储库
它们中没有业务逻辑,它们仅用于在服务和EF之间传输对象。它是否正确?我在这里使用通用存储库实现接口。那么你可以扩展通用存储库以满足特殊需求吗?

关于术语的问题
1)业务对象是否等于域对象?域对象应包含多少逻辑?

2)域模型是EF模型吗?我正在使用Model-First方法。

3)依赖注入 - 我应该使用它吗?我理解它是如何工作的,只是没有得到真正的好处。我和Ninject一起玩。

我认为社区将受益于某种包含代码示例的所有最佳实践的wiki。那里有类似的东西吗?很多样本都非常简单,许多微软样本即使在声称时也不使用这种模式。

提前感谢所有拥有并将帮助我的人。

顺便说一句 - 我认为StackOverflow需要一点点“接受答案”复选框旁边的“买我一个啤酒”按钮:)

1 个答案:

答案 0 :(得分:30)

  

是视图模型DTO吗?

可以被视为控制器和视图之间的一种数据传输对象。

  

它们是否只包含Name,AddressLine1,Address City等简单属性,或者它们是否应包含复杂属性,多个对象等。

理想的简单属性,但也可以聚合其他视图模型,但没有模型(例如:像EF模型)。

  

是否在视图模型中进行验证。

有两种类型的验证逻辑:业务验证(例如用户名已经存在)进入服务层并进行UI验证(例如:需要用户名),进入视图模型。

  

视图模型是否只包含从EF返回的POCO类,还是应该使用AutoMapper?

视图模型中没有EF。视图模型是具有简单属性的POCO类,其他复杂属性指向其他视图模型。它们还可以包含方法,以便正确格式化将在这些模型所针对的特定视图上呈现的数据。

  

如果使用AutoMapper和DTO,DTO是POCO类的克隆吗?

不确定我理解这个问题。

  

您会在控制器,视图模型或下面的服务层中进行映射吗?

控制器。

  

对我而言,服务是与存储库联系以从EF获取POCO对象的对象。这就是我所有业务逻辑的所在。一旦服务将对象传递回存储库以持久保存到EF,它们就被视为有效对象。这是对的吗?

  

域模型是EF模型吗?

如果您使用的是EF Code first方法,则为yes,否则为no(如果EF使用EF特定属性和类污染域)。

  

它们中没有业务逻辑,它们仅用于在服务和EF之间传输对象。它是否正确?

  

我在这里使用通用存储库实现接口。那么你可以扩展通用存储库以满足特殊需求吗?

是的,但不要太花哨。通常,存储库用于CRUD操作。它的服务应该包含业务逻辑。

  

业务对象是否等于域对象?

是。

  

域对象应包含多少逻辑?

这取决于您正在使用的特定项目的域逻辑数量,以及您可以从您或其他人工作过的旧项目中重复使用的任何现有域逻辑。

  

依赖注入 - 我应该使用它吗?

是的,绝对。

  

我理解它是如何运作的,只是没有得到真正的好处

它在应用程序的不同层之间提供了较弱的耦合,这使得它们更容易在其他项目中进行单元测试和重用。

  

我认为社区会受益于某种包含所有代码示例最佳实践的wiki。

我同意。

  

那里有类似的东西吗?

我对此表示怀疑。

  

顺便说一句 - 我认为StackOverflow需要一个“接受答案”复选框旁边的“买我一个啤酒”按钮

不能同意。