是否存在在基于DDD的分层体系结构中的模型和数据访问层之间使用LINQ的建议模式

我一直在阅读Tim McCarthy 关于.NET中DDD的精彩书籍 。 在他的示例应用程序中,他的基础数据访问是使用SqlCE并且他手工编写SQL内联。

我一直在使用一些模式来利用Entity Framework,但我已经陷入了如何将IRepository linq查询映射到底层数据访问层的问题。

我有一个名为的具体存储库实现。

public EFCustomerRepository : IRepository { IEnumerable GetAll( Expression<Func> predicate) { //Code to access the EF Datacontext goes here... } } 

在我的EF模型中,我正在使用POCO实体,但即便如此,我的DomainEntity.Customer和我的DataAccessLayer.Customer对象之间也没有本地映射。

所以我不能只将Expression<Func> predicate作为EFContext.Customers.Where(...);的参数EFContext.Customers.Where(...);

是否有一种简单的方法来映射Expression<Func> predicate => Expression<Func> predicate

或者我这样做错了吗? 任何建议/指针赞赏。

从您的示例中提供的代码我猜您没有使用通用存储库模式?

我使用EF CodeFirst(但它适用于旧的EF)以及通用的存储库模式… http://average-uffe.blogspot.com/2011/03/repository-pattern-with-ef-code-first.html

我在该post中没有Expression> ,但我总是在IRepository界面中有一个Find metod。

界面:

 IEnumerable Find(Expression> expression, int maxHits = 100); 

并在抽象baserepository中实现:

 public virtual IEnumerable Find(Expression> expression, int maxHits = 100) { return this.DataContext.DbSet().Where(expression).Take(maxHits); } 

现在你可以通过lambda表达式在任何实体上调用Find …

如果你没有把它弄好,我可以发布一个完整的例子,只是说什么时候。

在这种情况下,您必须将一个表达式树的自定义转换器实现为另一个表达式树(可能多于一个),这将完全涉及您的映射逻辑。 通常,您的表达式目前只是规范(规范模式),您必须将该规范转换为存储表达式。

顺便说一句。 这是错误的。 不应该有单独的数据访问层对象 – 数据访问层应该直接加载和保存域对象,但EF不能完全正确地执行它,因为它的映射function有限并且它将自己的需求推送到实体。 如果你想认真地做DDD(按书),你应该检查NHibernate或其他ORM。