1.container.AddTransient为瞬时生命周期,每次创建都是一个全新的实例
2.container.AddSingleton单例:全容器都是一个
3.container.AddScoped请求单例,一个请求代表一个作用域
1.瞬时埋高碰,即时构造,即时销毁
2.单例,永远只构造一次
3.作用念禅域单例,一次请求只构造一个
第一次请求解析
1.开始构造A类,因为是瞬时生命周期那么第一次请求就会被构造,然后销毁
2.在构造B类时需要A类,那么会首先构造A类(因为A类瞬时上一次已经被销毁),然后构造B类为单例
3.开始构造C,在构造时需要B类,因为B类全局单例,那就会直接构造C为作用域单例
4.直接构造瞬时D类
5.开始构造E类,构造式需要C类,因为C类为作用域单例,那么就会直接构造E类为瞬时
第一次请求结论
第二次请求解析
1.开始构造A类,因为是瞬时生命周期那么第二次请求就会重新被构造,然后销毁
2.在构造B类时因为在第一次请求时已经构造为单例,所以不再被构造
3.开始重新构造C,因为C在第二次请求为新的作用域,在构造时需要B类,因为B类全局单例,那就会直接构造C为作用域单例
4.直接构造瞬时D类
5.开始构造E类,构造式需要C类,因为C类为作用域单例,那么就会直接构造E类为瞬时
第二次请求结论
1.输出A
2.输出C
3.输出D
4.输出E
如果不想通过构造全部自动注入,能自定义注入
1.using Microsoft.Extensions.DependencyInjection
2.首先注入 IServiceProvider serviceProvider,利用serviceProcider.GetService()生成需要的实例
1.下载Autofac.Extensions.DependencyInjection和Autofac包
2.在Program网站启动时替换默认IOC工厂实例为Autofac,UseServiceProviderFactory(new AutofacServiceProviderFactory())
3.在Startup类中添加方法public void ConfigureContainer(ContainerBuilder services){services.RegisterType().As().SingleInstance()}
1.NuGet安装引用Autofac.Extras.DynamicProxy
2.引用using Autofac.Extras.DynamicProxy
3.创建类库继承自IInterceptor实现接口
4.自定义的Autofac的AOP扩展
前言
.NET Core 自带依赖注入框架,支持三种不同生命周期的注入模式:
Singleton 单例模式
Scoped 区域模式
Transient 瞬时模式
但是也不知道什么时候使用哪种模式才最合适,接下来我就用代码详细解读一下三种模式
代码示例
首先新建.NET Core API项目来进行代码测试
分别新建 Scoped、Singleton、Transient 三种模式的服务与接口,里面写一个GetIndex() 方法获取index ,用来区别服务的生命周期。
三个服务代码都是如此,然后添加依赖注入
最后在控制器中添加测试方法
使用 [FromService] 特性注入服务,每次服务注入两次,用来区别服务的变化,输出服务的index,启动项目查看结果
上图可以看到单例和区域模式下,两次注入的服务index是叠加的,可以说明两次服务注入的都是同一个。而瞬时模式两次注入的服务启锋index都是初始值,也就说明两次服务都是新的。然后我们不停止项目在执行一次方法
可以看到单列模式和区域模式卖州有了不同,单例模式注入的服务,index值一直在叠加,而区域模式有重新从0开始叠加。
总结
结合以上示例可以清楚地分别三种模式的差别
Singleton
单例模式,服务在第一次请求时被创建,其后的每次请求都沿用这个已创建的服务。
Scoped
作用域模式,服务在每次请求时被创建,整个请求过程中都贯穿使用这个创建的服务。
Transient
瞬态悄配晌模式,服务器在每次请求时被创建
Controller构造函者轿数中是否使用了IBannerService声明一橡简个 private readonly IBannerService _bannerService
构造函数中
public Controller(IBannerService bannerService)
{
this._bannerService = bannerService
}
下梁嫌裤面的方法中可以用_bannerService.xxxxx()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)