概述
autofac生命周期,一共有六种生命周期。通过下面示例展示每种声明周期的作用范围:
public void ConfigureContainer(ContainerBuilder containerBuilder)
{
#region autofac生命周期
//autofac生命周期 六种生命周期
//1.瞬时生命周期:注册之后,每次获取的服务实例都不一样
containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>().InstancePerDependency();
//2.单例:如果使用单例生命周期注册,那么在整个容器中获取的服务实例都是同一个
containerBuilder.RegisterType<TestServiceB>().As<ITestServiceB>().SingleInstance();
//3.作用域生命周期:只有在相同作用域下获取到的服务实例才是相同的
containerBuilder.RegisterType<TestServiceC>().As<ITestServiceC>().InstancePerLifetimeScope();
//4.作用域生命周期:相比上一种,可以更加精确到指定某一个作用域
containerBuilder.RegisterType<TestServiceD>().As<ITestServiceD>().InstancePerMatchingLifetimeScope("MyRequest");
//5.某个请求的声明周期:不同的请求获取到的服务实例不一样
//containerBuilder.RegisterType<TestServiceE>().As<ITestServiceE>().InstancePerRequest();
//6.拥有隐式关系:类型的创建新的嵌套声明周期作用域,可以使用每一个拥有实例的注册来依赖关系限定到拥有的实例
//containerBuilder.RegisterType<TestServiceB>().InstancePerOwned<ITestServiceF>();
IContainer container = containerBuilder.Build();
ITestServiceA testServiceA1 = container.Resolve<ITestServiceA>();
ITestServiceA testServiceA2 = container.Resolve<ITestServiceA>();
Console.WriteLine($"testServiceA1和testServiceA2 是否相同 {object.ReferenceEquals(testServiceA1, testServiceA2)}");//false
ITestServiceB testServiceB1 = container.Resolve<ITestServiceB>();
ITestServiceB testServiceB2 = container.Resolve<ITestServiceB>();
Console.WriteLine($"testServiceB1和testServiceB2 是否相同 {object.ReferenceEquals(testServiceB1, testServiceB2)}");//true
ITestServiceC testServiceC1 = container.Resolve<ITestServiceC>();
ITestServiceC testServiceC2 = container.Resolve<ITestServiceC>();
Console.WriteLine($"testServiceC1和testServiceC2 是否相同 {object.ReferenceEquals(testServiceC1, testServiceC2)}");//true
using (var inner = container.BeginLifetimeScope("MyRequest"))
{
ITestServiceD testServiceD1 = inner.Resolve<ITestServiceD>();
ITestServiceD testServiceD2 = inner.Resolve<ITestServiceD>();
Console.WriteLine($"testServiceD1和testServiceD2 是否相同 {object.ReferenceEquals(testServiceD1, testServiceD2)}");//true
using (var inner1 = container.BeginLifetimeScope("MyRequest"))
{
ITestServiceD testServiceD3 = inner1.Resolve<ITestServiceD>();
ITestServiceD testServiceD4 = inner1.Resolve<ITestServiceD>();
Console.WriteLine($"testServiceD3和testServiceD4 是否相同 {object.ReferenceEquals(testServiceD3, testServiceD4)}");//true
Console.WriteLine($"testServiceD1和testServiceD3 是否相同 {object.ReferenceEquals(testServiceD1, testServiceD3)}");//false
}
}
#endregion
}
六种生命周期分别为:
1.瞬时生命周期:注册之后,每次获取的服务实例都不一样
2.单例:如果使用单例生命周期注册,那么在整个容器中获取的服务实例都是同一个
3.作用域生命周期:只有在相同作用域下获取到的服务实例才是相同的
4.作用域生命周期:相比上一种,可以更加精确到指定某一个作用域
5.某个请求的声明周期:不同的请求获取到的服务实例不一样(使用较少)
6.拥有隐式关系:类型的创建新的嵌套声明周期作用域,可以使用每一个拥有实例的注册来依赖关系限定到拥有的实例(使用较少)
最后
以上就是腼腆朋友为你收集整理的Asp.NetCore3.1 Autofac生命周期的全部内容,希望文章能够帮你解决Asp.NetCore3.1 Autofac生命周期所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复