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

Eoi*_*ell 7 c# linq domain-driven-design entity-framework object-object-mapping

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

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

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

public EFCustomerRepository : IRepository<DomainEntities.Customer> 
{
    IEnumerable<DomainEntities.Customer> GetAll(
                     Expression<Func<DomainEntities.Customer, bool>> predicate)
    {
        //Code to access the EF Datacontext goes here...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

所以我不能只Expression<Func<DomainEntities.Customer, bool>> predicate作为参数传递给EFContext.Customers.Where(...);

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

或者我这样做是错的?任何建议/指针赞赏.

Uff*_*ffe 3

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

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

我在那篇文章中没有Expression<Func<DomainEntities.Customer, bool>> ,但我总是在界面中有一个 Find 方法IRepository<T>

界面:

IEnumerable<T> Find(Expression<Func<T, bool>> expression, int maxHits = 100);
Run Code Online (Sandbox Code Playgroud)

以及抽象baserepository中的实现:

public virtual IEnumerable<T> Find(Expression<Func<T, bool>> expression, int maxHits = 100) {
    return this.DataContext.DbSet<T>().Where(expression).Take(maxHits);
}
Run Code Online (Sandbox Code Playgroud)

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

如果您不明白,我可以发布一个完整的示例,只需说明时间即可。