IOC容器的两个重要包 建议通过nuget引入
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.DependencyInjection.Abstractions
IOC容器的两个重要的类型
ServiceCollection 作为容器把对象类型(类型即是服务)注册进去 大白话:就是
ServiceProvider 作为类型(服务)的提供者 大白话:从集合中把对象取出的提供者
用以上两个类型的简单使用案例,直观了解ServiceCollection和ServiceProvider 的作用过程
class TestClass
{
public void Main()
{
//先创建所有类的容器 IserviceCollection
IServiceCollection serviceCollection = new ServiceCollection();
//项目中可能用到的类注册进入容器,注意我使用了三个不同方法,效果不同,后面解释
serviceCollection.AddTransient<Parent1>();
serviceCollection.AddScoped<Parent2>();
serviceCollection.AddSingleton<Parent3>();
//创建对象
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
Parent1 parent1 = serviceProvider.GetService<Parent1>();
Parent2 parent2 = serviceProvider.GetService<Parent2>();
Parent3 parent3 = serviceProvider.GetService<Parent3>();
parent1.DoSomethings();
parent2.DoSomethings();
parent3.DoSomethings();
}
}
//以下为需要注册进ServiceCollection的类型
class Parent1
{
public void DoSomethings()
{
Console.Write("我是父类1");
}
}
class Parent2
{
public void DoSomethings()
{
Console.Write("我是父类2");
}
}
class Parent3
{
public void DoSomethings()
{
Console.Write("我是父类3");
}
}
总结以上ServiceCollection和ServiceProvider的使用过程(我可能喜欢以提问的方式让你注意到某些东西)
1.ServiceCollection的作用是什么
ServiceCollection用来存放项目中的其他所有需要用到的其他类型
2.ServiceCollection存放其他类型有哪三个方法
ServiceCollection.AddTransient<T>();
ServiceCollection.AddScope<T>();
ServiceCollection.AddSingleTon<T>();
暂时不讨论这个三个方法有什么作用,目前你需要大概只要有这个三个方法存在)
3.ServiceCollection存入类型,那取出对象也是通过ServiceCollection吗
不是! 通过ServiceCollection创造出ServiceProvider,然后才能取出对象
以上知识只涉及到.NET Core为我们提供了一种全新的创造对象的模式,此中模式可以称为ServiceLocator(服务定位器)模式
类型关系图(个人向)
---预告 下篇文章主要介绍ServiceLocator模式创建对象的三种生命周期