在.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