1

EF 核心包含您可能希望用于复杂查询的功能。例如AsNoTracking(),SumAsyncMaxAsync查找更改/修改的实体等在Microsoft.EntityFrameworkCore程序集中可用

干净的架构中,该ApplicationCore层不允许直接访问 DBContext,并且只能通过公共存储库接口和规范访问数据

我理解关注点分离和从域层抽象持久层的想法。将来如果您更改数据库,您只需要更改持久层。然而实际上,在企业级应用程序中,您多久更改一次数据库。一旦投入生产,就很难简单地更换它。

public class ToDoItemSearchService : IToDoItemSearchService
{
  private readonly IRepository<Project> _repository;

  public ToDoItemSearchService(IRepository<Project> repository)
  {
    _repository = repository;
  }

  public async Task<Result<List<ToDoItem>>> GetAllIncompleteItemsAsync(int projectId, string searchString)
  {
     var project = await _repository.GetBySpecAsync(projectSpec);   
    // how to load entities without tracking
  }
}

如何访问 EF 功能?存储库应该公开这些吗?例如

public interface IRepository<TEntity>
{
      List<TEntity> GetBySpecAsync>(...);
      List<TEntity> GetBySpecAsyncWithNoTracking(...)

}
4

1 回答 1

-2

如果你认为好处可能超过打破模式/范式的缺点,你可以打破任何你想要的范式。

如果您设计存储库类,我建议您甚至不要考虑如何使其成为最通用的存储库,并尽量不要公开实现细节。

您的应用程序逻辑是否关心跟踪/不跟踪事物?在 90% 的情况下,我会说它不会 -> 在接口中为每个用例创建特定方法(例如您的 GetBySpec(),如果特殊用例需要其他特殊结果(最大、无跟踪、排序依据)只需创建另一个名为 eg GetBySpecByName(),. 你的存储库需要覆盖的用例数量将少于 EF 提供的所有功能的 5%,因此甚至不值得创建如何公开所有内容的高级解决方案)

于 2021-12-24T00:48:40.473 回答