gpt4 book ai didi

entity-framework - 通用存储库和泄漏抽象

转载 作者:行者123 更新时间:2023-12-04 08:34:41 24 4
gpt4 key购买 nike

我正在实现存储库模式。我这样做的主要原因:

  • 将客户端代码从持久性细节中抽象出来( Entity Framework )
  • 支持可测试性

  • 通用存储库与否?

    我遇到的问题是我是否应该有一个通用存储库。一个 IQueryable<T> Query()方法将为调用代码提供构造特定查询的方法。这里的问题是这是泄漏的抽象—— Entity Framework 的细节现在正在泄漏到我的客户端代码中。

    enter image description here
  • 这将如何影响单元测试? 我还能模拟ICustomerRepository吗?用这个实现?
  • 这种效果会如何替换我的持久层? 像 Azure 存储表或 NHibernate。

  • 否则我将不得不在 ICustomerRepository 上实现非常具体的查询方法。 ,如 GetIsActiveByFirstName()GetIsActiveByDistrict() .我非常不喜欢这个,因为我的存储库类将挤满不同的查询方法。这个系统有数百个模型,因此可能有数百甚至数千个这样的方法来编写和维护。

    最佳答案

    你可以有一个比较干净的IRepository<T>通过坚持模式。

    数据访问层

  • 引用 EF 和 Core 项目
  • Respository<T> : IRepository<T>
  • 选项有 IEFJunk 声明(仅当使用多个存储库时)
  • 引用核心
  • 存储库被注入(inject)上下文(通常在实例化期间)

  • 核心
  • 可以“注入(inject)”的接口(interface)
  • IRepository 声明。不使用 EF 数据类型。
  • 不引用 EF

  • 所以现在Core中的代码你可以引用 IRepository<t> .
    实现类可以具有 EF 细节。但这不能从核心访问!

    所以你可以有 IQueryable。
      public interface IRepositoryBase<TPoco>{
    IQueryable<TPoco> GetListQ(Expression<Func<TPoco, bool>> predicate);
    //...

    但是,如果您决定要添加
     //...
    // logically exposing IQueryable<T> Include<T>(this IQueryable<T> source, string path) from EF
    IQueryable<TPoco> IncludeNAVProp(string navToInclude);
    }

    然后是存储库实现
    return  Context.Set<TPoco>().Include(navToInclude);

    要求底层提供者是 EF。所以现在 mock 是针对一个实际的 EF 提供者。

    除非您小心,否则 EF 特定代码。泄漏出来。
    事实上,具有概念“包含”的接口(interface) IRepository 已经可以被认为是 LEAKY。
    将 EF 细节保留在您的接口(interface)之外,是避免泄漏的关键。
    你可以有 1 IRepository<t>和 1 Respository<t>并支持数百张表

    关于entity-framework - 通用存储库和泄漏抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20512723/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com