NETCORE依赖注入
2021-04-01 本文已影响0人
醉酒的姑娘
依赖注入的组件包:
Microsoft.Extensions.DependencyInjection.Abstractions
Microsoft.Extensions.DependencyInjection
依赖注入框架核心是这两个包,一个抽象包,一个具体的实现,这里用到了一个比较经典的设计模式,接口实现分离模式
抽象包只包含接口的定义,实现包会包含具体的实现,我们的组件只需要依赖他的抽象接口而不需要依赖他的实现,当使用时注入他的具体实现即可
核心类型:
IServiceCollection 负责服务的注册
ServiceDescriptor 每个服务注册时的信息
IServiceProvider 具体的容器,由ServiceCollection Builder出来的
IServiceScope 表示容器的生命周期
生命周期:
单例 Singleton
作用域Scoped
瞬时 Transient
从请求结果可以看出:
Singleton 整个应用程序内都是一个对象实例
Transient 每次请求都会得到一个新对象实例
Scoped 每个请求内的对象是相同的,不同的请求得到的对象实例是不同的
//在ConfigureServices注入服务
services.AddSingleton<IMySingletonService, MySingletonService>();
services.AddScoped<IMyScopedService, MyScopedService>();
services.AddTransient<IMyTransientService, MyTransientService>();
//在Controller中获取服务
//FromServices 这个标注的作用可以从容器里面获取我的对象
//当注入的服务是大部分接口都需要使用的情况下,推荐的做法是使用构造函数的注入方式
//当服务仅仅是某一个接口使用的情况下,推荐使用FromServices的方式注入
[HttpGet("GetService")]
public int GetService([FromServices] IMySingletonService singleton1,
[FromServices] IMySingletonService singleton2,
[FromServices] IMyScopedService scoped1,
[FromServices] IMyScopedService scoped2,
[FromServices] IMyTransientService transient1,
[FromServices] IMyTransientService transient2)
{
Console.WriteLine($"singleton1:{singleton1.GetHashCode()}");
Console.WriteLine($"singleton2:{singleton2.GetHashCode()}");
Console.WriteLine($"scoped1:{scoped1.GetHashCode()}");
Console.WriteLine($"scoped2:{scoped2.GetHashCode()}");
Console.WriteLine($"transient1:{transient1.GetHashCode()}");
Console.WriteLine($"transient2:{transient2.GetHashCode()}");
Console.WriteLine($"==============请求结束=============");
return 1;
}
//其他方式注入
services.AddSingleton<IMySingletonService>(new MySingletonService());//直接注入实例
services.AddSingleton<IMySingletonService>(serviceProvier =>
{
return new MySingletonService();
});//通过工厂的方式注入
//注册泛型模板
services.AddSingleton(typeof(IGenericService<>),typeof(GenericService<>));