我的 .NET 5.0 C# 项目中的循环依赖 - 我该如何解决它?
Circular Dependency in my .NET 5.0 C# project - how can I solve it?
我有以下项目结构和以下命名空间:
- 解决方案:
ProjectName
- 子项目:
ProjectName.Shared
- 包含命名空间:
ProjectName.Shared.Logging
- 子项目:
ProjectName.DbContext
- 有项目参考:
ProjectName.Shared
- 使用命名空间:
ProjectName.Shared.Logging
DbContext
项目当前正在使用对 Shared
项目的项目引用,因为我们想通过解决方案范围内使用的 Logger 记录数据。
现在应该更改为记录器也应该写入一些数据库。对我来说,如果我尝试在 ProjectName.Shared
.
中添加 ProjectName.DbContext
作为项目引用,它将成为循环项目依赖项
然后看起来像这样:
- 解决方案:
ProjectName
- 子项目:
ProjectName.Shared
- 包含命名空间:
ProjectName.Shared.Logging
- 有项目参考:
ProjectName.DbContext
- 使用命名空间:
ProjectName.DbContext
- 子项目:
ProjectName.DbContext
- 有项目参考:
ProjectName.Shared
- 使用命名空间:
ProjectName.Shared.Logging
我正在考虑创建一个名为 ProjectName.Logging
的新子项目,但我看不出它如何解决我的循环依赖问题; ProjectName.Logging
需要 ProjectName.DbContext
反之亦然。
有人知道如何解决循环依赖吗?
四个选项:
- 合并
ProjectName.Shared
和 ProjectName.DbContext
程序集
- 查看其中一个是否可以声明一个接口 - 也许
ProjectName.DbContext
可以声明并接受一个 IDbLogger
接口,然后 实现 ProjectName.Shared
并传入,因此它可以在不了解详细信息的情况下进行记录
- 在下方创建一个附加包,它具有日志抽象,
ProjectName.Shared
和ProjectName.DbContext
都可以参考
- 与 3 相似,但使用 Microsoft.Extensions.Logging.Abstractions
中的预卷 ILogger[<T>]
(技术上也可以创建一个真正的循环构建,但可怕复杂,非常 脆弱,你不应该将其视为绝对最后手段的黑客攻击)
我有以下项目结构和以下命名空间:
- 解决方案:
ProjectName
- 子项目:
ProjectName.Shared
- 包含命名空间:
ProjectName.Shared.Logging
- 包含命名空间:
- 子项目:
ProjectName.DbContext
- 有项目参考:
ProjectName.Shared
- 使用命名空间:
ProjectName.Shared.Logging
- 有项目参考:
- 子项目:
DbContext
项目当前正在使用对 Shared
项目的项目引用,因为我们想通过解决方案范围内使用的 Logger 记录数据。
现在应该更改为记录器也应该写入一些数据库。对我来说,如果我尝试在 ProjectName.Shared
.
ProjectName.DbContext
作为项目引用,它将成为循环项目依赖项
然后看起来像这样:
- 解决方案:
ProjectName
- 子项目:
ProjectName.Shared
- 包含命名空间:
ProjectName.Shared.Logging
- 有项目参考:
ProjectName.DbContext
- 使用命名空间:
ProjectName.DbContext
- 包含命名空间:
- 子项目:
ProjectName.DbContext
- 有项目参考:
ProjectName.Shared
- 使用命名空间:
ProjectName.Shared.Logging
- 有项目参考:
- 子项目:
我正在考虑创建一个名为 ProjectName.Logging
的新子项目,但我看不出它如何解决我的循环依赖问题; ProjectName.Logging
需要 ProjectName.DbContext
反之亦然。
有人知道如何解决循环依赖吗?
四个选项:
- 合并
ProjectName.Shared
和ProjectName.DbContext
程序集 - 查看其中一个是否可以声明一个接口 - 也许
ProjectName.DbContext
可以声明并接受一个IDbLogger
接口,然后 实现ProjectName.Shared
并传入,因此它可以在不了解详细信息的情况下进行记录 - 在下方创建一个附加包,它具有日志抽象,
ProjectName.Shared
和ProjectName.DbContext
都可以参考 - 与 3 相似,但使用 Microsoft.Extensions.Logging.Abstractions 中的预卷
ILogger[<T>]
(技术上也可以创建一个真正的循环构建,但可怕复杂,非常 脆弱,你不应该将其视为绝对最后手段的黑客攻击)