使用仓储模式的Entity Framework和Automapper?

6
我一直在创建一个新的应用程序,基本上我有我的数据访问层,服务层和表示层...所有工作都很好,但我正在使用由EF返回的实体类。问题在于我将它们传递到表示层,因此我需要将实体框架引用/数据访问添加到表示层-不好:
所以我的想法是以下内容,并且正在寻找一些帮助和确认我是否朝着正确的方向前进...
1. 在服务层中创建一组类,如客户,订单等,因为表示层对服务层有引用。 2. 当在数据访问中返回客户实体时,我会将实体类即Customer返回到服务层,然后在这里进行映射-我不确定是否喜欢这个方法? 3. 对于我用于映射的这些“标准类”的最佳位置在哪里?如果我将它们放在服务层并在数据访问中进行映射,则会创建一个循环引用,因为数据访问>服务和服务>数据访问..-它应该只有一种方式,即服务>数据访问
我在考虑使用Automapper(http://www.codeplex.com/AutoMapper)来解决这个问题,我是正确的吗?任何想法或示例都非常感谢。
就像我说的,唯一的问题是当我从数据访问层返回到服务层(使用Iqueryable)时,我需要将它们从实体类映射到标准集合类中。
我认为这就是我的困惑所在,我觉得不应该使用实体类,因为这意味着我需要在表示层中引用实体框架/数据访问才能访问实体类。
2个回答

3
你碰到了EF v1的弱点之一。目前来说,使用AutoMapper可以将EF实体转换为“纯粹”的业务实体并在上层中使用它们。
此外,预计随着.NET 4.0 / Visual Studio 2010发布的EF v4应该会在许多问题领域带来很大的改善——支持自己的纯净POCO(Plain Old CLR Objects)等等。请查看EF Design Blog。团队最近发布了许多非常有趣、非常有前途的帖子,涉及EF v4。我期待着它的到来!
马克

0
  1. 如果您将EF对象的接口提取到核心/公共项目中并从存储库或服务返回接口类型,则可以在Web项目中使用EF对象。您可以通过创建部分类并在其中添加以下内容使EF对象实现您的接口:

    partial class Customer : ICustomer

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接