在.net core中自带了IOC容器,并且提供了三种注入容器的方式。

其中,Addsingleton表示的是向容器中注入一个单例,其贯穿容器的始终。

但是Addsingleton的依附对象是ServiceProvider而不是ServiceCollection

例如:

我们准备如下的IClassA、ClassA和ClassB:

public interface IClassA
{
  
}
public class ClassA : IClassA
{
    public ClassA()
    {
        Init();
    }

    private void Init()
    {
        Console.WriteLine("Hello!!!");
    }
}
public class ClassB
{
    private IClassA _classA;
    public ClassB(IClassA classA)
    {
        this._classA = classA;
    }
}

然后我们调用:

IServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IClassA,ClassA>();
serviceCollection.AddSingleton<ClassB>();
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
serviceProvider.GetRequiredService<IClassA>();
serviceProvider.GetRequiredService<ClassB>();

此时我们会发现输出的结果是:

Hello!!!

但是,如果我们是先注入IClassA,使用后再注入ClassB呢?

IServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IClassA,ClassA>();
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
serviceProvider.GetRequiredService<IClassA>();
serviceCollection.AddSingleton<ClassB>();
serviceProvider = serviceCollection.BuildServiceProvider();
serviceProvider.GetRequiredService<ClassB>();

此时我们会发现他的输出是:

Hello!!!
Hello!!!

这说明了AddSingleton是基于ServiceCollection Build之后的ServiceProvider而不是ServiceCollection

最后修改:2023 年 01 月 03 日
打点赏咯~