我的 .NET 5.0 C# 项目中的循环依赖项 - 如何解决?

Circular Dependency in my .NET 5.0 C# project - how can I solve it?

提问人:Jana Weschenfelder 提问时间:8/26/2021 最后编辑:TylerHJana Weschenfelder 更新时间:8/26/2021 访问量:479

问:

我有以下项目结构,具有以下命名空间:

  • 溶液:ProjectName
    • 子项目:ProjectName.Shared
      • 包含命名空间:ProjectName.Shared.Logging
    • 子项目:ProjectName.DbContext
      • 有项目参考:ProjectName.Shared
      • 使用命名空间:ProjectName.Shared.Logging

该项目当前正在使用对该项目的项目引用,因为我们希望通过解决方案范围内使用的 Logger 来记录数据。DbContextShared

现在要改变它,以便记录器也应该写入一些数据库。这对我来说意味着,如果我尝试在 中添加为项目引用,它将成为循环项目依赖项。ProjectName.DbContextProjectName.Shared

然后它看起来像这样:

  • 溶液:ProjectName
    • 子项目:ProjectName.Shared
      • 包含命名空间:ProjectName.Shared.Logging
      • 具有项目引用:ProjectName.DbContext
      • 使用命名空间:ProjectName.DbContext
    • 子项目:ProjectName.DbContext
      • 具有项目引用: ProjectName.Shared
      • 使用命名空间:ProjectName.Shared.Logging

我正在考虑创建一个名为 的新子项目,但我看不出它将如何解决我的循环依赖问题; 需要,反之亦然。ProjectName.LoggingProjectName.LoggingProjectName.DbContext

有人知道如何解决这种循环依赖关系吗?

C# 服务器端 .NET-5 循环依赖项 blazor-webassembly

评论


答:

2赞 Marc Gravell 8/26/2021 #1

四个选项:

  1. 合并 和 程序集ProjectName.SharedProjectName.DbContext
  2. 看看他们中的一个是否可以声明一个接口 - 也许可以声明并接受一个接口,然后实现并传入,这样它就可以进行日志记录,而不必知道细节ProjectName.DbContextIDbLoggerProjectName.Shared
  3. 在下面创建一个额外的包,其中包含日志记录抽象,这两个抽象都将引用ProjectName.SharedProjectName.DbContext
  4. 像 3,但使用来自 Microsoft.Extensions.Logging.Abstractions 的预卷ILogger[<T>]

从技术上讲,创建一个真正的圆形构建也是可能的,但它非常复杂,非常脆弱,你不应该把它看作是绝对的最后手段)