干净的架构:反转 EF DbContext 的依赖关系

问题描述 投票:0回答:1

我偶然发现了这篇文章,它解释了干净架构的原则。我想在 ASP.NET Core + EF 中应用这些原则。我被困在这部分了:

应用层仅依赖于抽象,定义于 接口,这些接口是在外层实现的。为了 例如,持久性问题(例如将项目保存到数据库) 仅根据要求进行定义;持久化逻辑 基础设施层实现了这些要求。

听起来很合理,应用程序层不应该知道 EF 是一个东西,而只暴露一个接口,然后由基础设施层的数据库上下文实现。

然而,当我尝试时,我遇到了阻碍。假设我的数据库上下文如下所示:

public class DbContext {
   public DbSet<Person> Persons {get; set;} = null!;
}

根据 Clean Architecture,

DbContext
现在应该实现驻留在应用程序层的
IDbContext

public interface IDbContext {
   public DbSet<Person> Persons {get; set;}
}

但是,

DbSet
是EF中定义的类型,因此应用层也需要依赖EF,根据我对本文和Clean Architecture的理解,这是违反原则的。

文章还链接了一个存储库,当我查看应用层的依赖关系时,我发现他们实际上让应用层也依赖于 EF。

有什么想法可以摆脱这个困境并实现独立于基础设施层和 EF 的应用程序层吗?

c# entity-framework entity-framework-core clean-architecture dependency-inversion
1个回答
0
投票

有不同的方法,各有不同的缺点:

  1. 使用
    IQueryable
    接口而不是
    DbSet
    - 尽管它仍然是一个有漏洞的抽象(像
    Include
    这样的方法是 EF 特定的)
  2. 根本不要将上下文公开为域的一部分 - 使用 EF Core 之上的存储库。请注意,这可以被视为反模式(并且有很多 - 例如
  3. 在域/应用程序级别上使用 CQRS 模式(或类似的模式),查询和命令将被声明为接口,并将通过 EF 在基础设施级别上实现。
© www.soinside.com 2019 - 2024. All rights reserved.