6

一直忙于创建一个新应用程序,基本上我有我的数据访问、服务层和表示层......一切都很好,但我正在使用 EF 返回的实体类。这里的问题是我将这些传递到表示层,所以我需要将实体框架引用 /dataccess 添加到表示层 - 不好:

所以我的想法如下,并且正在寻找一些帮助和确认我正在走正确的路线......

  1. 在服务层中创建一组类,如客户、订单等,因为表示层有对服务层的引用。

  2. 当在数据访问中返回客户实体时,我会将实体类(即客户)返回给服务,我会在这里进行映射 - 不太确定我是否喜欢这个?

  3. 我用于映射的这些“标准类”的最佳位置在哪里,如果我将它们放在服务层并映射数据访问,那么这将创建一个循环引用作为数据访问>服务和服务>数据访问.. - 它应该只是一种方式,即服务 > 数据访问

我正在考虑使用 Automapper ( http://www.codeplex.com/AutoMapper ) 来解决这个问题,我在正确的路线上吗???任何想法或例子都非常感谢..

正如我所说,唯一的是当我从数据访问返回到服务层(使用 Iqueryable)时,我需要将这些从实体类中映射出来并使用标准集合类。

我认为这是我感到困惑的地方,我确实觉得使用实体类不好,因为这意味着我需要在我的表示层中引用实体框架/数据访问才能访问实体类..

4

2 回答 2

3

您遇到了 EF v1 的弱点之一。现在,是的,使用 AutoMapper 的路线当然可以让您将 EF 实体转换为“直接”业务实体并在更高层中使用它们。

此外,.NET 4.0 / Visual Studio 2010 的 EF v4 应该会在许多问题领域带来很多缓解 - 支持您自己的直接 POCO(普通旧 CLR 对象)等等。查看EF 设计博客。该团队最近发布了许多关于 EF v4 的非常有趣、非常有前途的帖子。我对此很期待!

马克

于 2009-05-24T17:06:09.267 回答
0
  1. 如果将 EF 对象的接口提取到核心/公共项目中并从存储库或服务返回 Web 项目使用的接口类型,则可以在 Web 项目中使用 EF 对象。您可以通过创建部分类并在此处添加来使 EF 对象实现您的接口:

    部分类客户:ICustomer

  2. 即使您可以做到 1. 技巧,您可能还是应该使用 automapper 将这些实体映射到适合您特定视图的自定义 ViewModel 对象。您还可以使存储库/服务的查询方法直接返回 DTO/ViewModels - 它有时可以使查询更高效(仅查询需要的列等),但这需要额外的 EF 映射。

于 2009-12-12T16:41:54.727 回答