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

Sam*_*Sam 23 entity-framework poco repository-pattern service-layer asp.net-mvc-3

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

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

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需要一点,"接受答案"复选框旁边的"买我一个啤酒"按钮:)

Dar*_*rov 30

是视图模型DTO吗?

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

它们应该只包含Name,AddressLine1,Address City等简单属性,还是应该包含复杂属性,多个对象等.

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

是视图模型中的验证.

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

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

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

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

不确定我理解这个问题.

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

控制器.

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

是.

域模型是EF模型吗?

如果您使用EF Code第一种方法,则为yes,否则为no(如果EF使用EF特定属性和类污染域).

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

是.

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

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

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

是.

域对象应包含多少逻辑?

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

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

是的,一点没错.

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

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

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

我同意.

那里有类似的东西吗?

我对此表示怀疑.

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

不能同意更多.

  • @Sam,如果您需要一个视图,它将显示客户的基本信息以及地址和订单的集合,您将构建一个CustomerViewModel,它将包含基本属性和一个`AddressViewModel`和一个`OrderViewModel`,它将包含属性你想为给定的客户展示他的地址和订单,然后`CustomerViewModel`可以有两个集合属性`AddressViewModel`和`OrderViewModel`. (2认同)
  • 就领域模型而言,就个人而言,我在分析项目需求时手动定义它们,并且从不使用任何*自动生成*作为域模型.如果你使用的是自动生成的东西,那就意味着你已经将你的域逻辑基于这个*某些东西*恕我直言,这不是一件好事.由您来分析项目要求并定义域对象.在以后阶段,您可以决定将模型映射到关系数据库或在互联网上购买第三方服务API或其他内容. (2认同)