【问题标题】:How to access EF functionalities in Clean architecture and .NET core [closed]如何在 Clean 架构和 .NET 核心中访问 EF 功能 [关闭]
【发布时间】:2021-12-23 19:17:52
【问题描述】:

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

clean architectureApplicationCore层不允许直接访问DBContext,数据只能通过通用存储接口和specifications访问

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

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(...)

}

【问题讨论】:

标签: c# asp.net-core asp.net-core-mvc clean-architecture ardalis-cleanarchitecture


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多