在没有存储库的实体框架中可重用查询.怎么样?

Ric*_*ard 7 entity-framework unit-of-work repository-pattern

让我说,我已经得出结论(经过大量试验),使用实体框架时,存储库和工作单元是错误的,错误的,错误的,这就说明了为什么这么好.

但我真的很讨厌这些嵌入式查询.问题是,如果我是如此反对存储库等,我可以在哪里放置它们?(只有请干净的答案,非常感谢的例子).

我刚刚完成了两个包含我的存储库,工作单元和数百个文件接口的项目,因为回报无处可见.我认为很多人,包括我自己,只是跳上了Repository的潮流,因为这是其他所有人都在做的事情,但回想起来,我认为这真是一个无处可去的地方.

/叹

理查德

Lad*_*nka 3

您希望将它们放在哪里?你只有几个选择:

  1. 让它们就在它们所在的地方,并使用自定义扩展方法、查询视图、映射数据库视图或自定义定义查询来定义可重用部件
  2. 将每个查询公开为某个单独类的方法。该方法不得公开IQueryable且不得接受Expression作为参数=整个查询逻辑必须包装在该方法中。但这将使您的类覆盖相关方法,就像存储库(唯一可以模拟或伪造的)。此实现接近于存储过程使用的实现。
  3. 您将执行与前面的方法相同的操作,但不是将查询放置在单独的类中,而是将它们直接作为实体的静态方法放置。这是可测试性更差的,因为静态方法不能被模拟取代(它需要更复杂的测试框架)。这是活动记录模式的一部分,其中每个实体负责将其加载并保存到数据库。

自定义扩展方法示例:

public static IQueryable<TEntity> GetByName(this IQueryalbe<TEntity> query, string name) 
    where TEntity : IEntityWithName
{
    return query.Where(e => e.Name == name);
}
Run Code Online (Sandbox Code Playgroud)

自定义类公开方法的示例:

public class QueryProvider
{
    public QueryProvider() {}

    public IEnumerable<TEntity> GetByName(IYourContext context, string name)
        where TEntity : IEntityWithName
    {
        return context.CreateObjectSet<TEntity>().Where(e => e.Name == name).ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)