C# 构造函数中的循环依赖注入

C# 构造函数中的循环依赖注入,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,在这种情况下: 公共A类:IA { 私有IB_IB{get;} 公共A(IB) { _ib=ib; } } B级:IB { 私家侦探{get;} 公共图书馆(IA) { _ia=ia; } } 在Startup.cs时,两者都注册为Singleton 为什么这不属于循环依赖关系?如果如您的评论所示,这些依赖关系是这样注册的: services.AddSingleton<IA, A>(); services.AddSingleton<IB, B>(); 任一解决方案均失

在这种情况下:

公共A类:IA
{
私有IB_IB{get;}
公共A(IB)
{
_ib=ib;
}
}
B级:IB
{
私家侦探{get;}
公共图书馆(IA)
{
_ia=ia;
}
}
Startup.cs
时,两者都注册为
Singleton


为什么这不属于循环依赖关系?

如果如您的评论所示,这些依赖关系是这样注册的:

services.AddSingleton<IA, A>();
services.AddSingleton<IB, B>();
任一解决方案均失败,但有一个例外:

System.InvalidOperationException:检测到类型为“UnitTestProject1.IB”的服务的循环依赖项

要做到这一点是不可能的。代码中经常发生看似不可能的事情,但实际上每种情况下的原因都是不正确的假设

您还提到它在一个环境中工作,但在另一个环境中不工作。假设(我已经做了很多次)相同的代码在两个环境中运行,但在本例中并非如此

在这种情况下,解决
IA
问题的唯一方法是,如果存在
IA
的另一个实现或
IB
的另一个实现(或者不太可能-
null
作为依赖项注入其中一个)



这类问题很有趣,因为当我们看到看似不可能的事情时,我们的倾向(至少是我的)往往是盯着它,想知道不可能是如何发生的。一旦我们确定我们认为正在发生的事情是不可能的,这表明我们应该开始质疑导致我们得出这个结论的所有其他假设。其中一个必须为false。

要确认,您要问的是,为什么这不是由于循环依赖而导致的失败?如果它是这样注册的:
services.AddSingleton();services.AddSingleton()
然后解析
IA
,这是一个循环依赖项,它确实失败了。您是如何注册它们的,您正在解决什么问题?@ScottHannen正如您所说,它们是像
services.AddSingleton()一样注册的;services.AddSingleton()。我让框架来做解析。实际上,今天我部署到了一个开发环境中,但不起作用,但在本地的
visualstudio
中起作用。奇怪,我只是在一个简单的单元测试中完成的。我以为它会失败,但它确实失败了。如果它是在我的评论中注册的,并且没有注册任何其他内容,那么它只能失败。100%肯定地说,如果它没有失败,那么事情就不同了。
[TestMethod]
public void TestCircularDependency()
{
    var services = new ServiceCollection();
    services.AddSingleton<IA, A>();
    services.AddSingleton<IB, B>();
    var provider = services.BuildServiceProvider();
    var a = provider.GetService<IA>();
    var b = provider.GetService<IB>();
}