文章目录
.net core启动顺序
- ConfigureWebHostDefaults 注册应用需要的组件(容器,配置)
- ConfigureHostConfiguration 注册应用启动时的组件(监听的端口)可嵌入自己的组件
- ConfigureAppConfiguration 嵌入自己的配置文件
- ConfiguraService
- Startup
- ConfigureService 以上三个都是在应用中注册自己的组件
- Configure 注入中间件的过程,处理HTTPContext的整个过程
program.cs 类
替换Startup启动类:
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
Console.WriteLine("ConfigureWebHostDefaults");
//webBuilder.UseStartup<Startup>();
webBuilder.Configure(app => {
//Startup的Configrue
});
webBuilder.ConfigureServices(server =>
{
//StartUp的方法
});
})
依赖注入(IOC)
接口实现分离模式
抽象包只包含他的方法,实现包只包含方法的实现
组件只需要依赖抽象包,在使用时注入即可,可以在使用时决定实现类是哪一个
核心类型
IServiceConllection 注册整个服务
ServiceDescriptor 服务注册时的信息
IServiceProvider 具体的容器IServiceConllectionbuild出来的
IServiceScope 一个容器子容器的生命周期
容器的生命周期
Singleton 单例 在不同请求或同一请求下的所有访问实现类都是唯一的 (根容器下唯一)
Scoped 作用域 在不同请求下实现类不唯一,在同一请求下的所有访问实现类唯一
Transient 瞬时 每次请求都会获得一个新的对象
依赖注入方法
services.AddSingleton<Interface,impl>
services.AddScoped<Interface,impl>
services.AddTransient<Interface,impl>
这三种方式是常规的注入实现类
service.TryAddSingleton<Interface,impl>
尝试注入,只有不存在该类型的实例时才注册
services.Replace(ServiceDescriptor.Singleton<Interface, impl>())
替换该类的实例
services.RemoveAll()
移除该类下的所有实例
依赖注入实例的获取
- Controller构造方法获取实例 如果该实例应用广泛,推荐
- [FromService]获取 如果该实例适用范围小,推荐
作用域和对象释放行为
作用域
IServiceScope
实现IDisposable接口的类,DI会负责管理其生命周期,对象使用完毕后,会释放对象
注意事项
- 在根容器不要获取IDisposable的瞬时服务
- 避免手动创建IDisposable对象的实现,应该使用容器来管理其生命周期(创建与释放)
- 单例模式的服务都是注册在根容器HttpContext.RequestServices.CreateScope()
第三方依赖注入组件
使用场景
- 当一个服务注册多次,用别名区分
builder.RegisterType<MyServerV2>().Named<IMyServer>("service2");
- 把服务注册到类的属性里
builder.RegisterType<MyServerV2>().As<IMyServer>().PropertiesAutowired();
- 动态代理:当我们在服务中注入额外的能力的时候
- 一些特殊的子容器
- 常规注册
builder.RegisterType<MyServer>().As<IMyServer>()