Autofac生命周期(4)
Autofac生命周期
一、控制范围和生命周期
1.Lifetime
是指服务的实例在程序中存活多久 – 从最初的实例化到清理(disposal)。例如,一个实现 IDisposable 的对象,它的生命周期就是从实例化时开始,持续到调用它的 Dispose 时结束。(未主动调用 Disopose 则持续到被GC收集时)。
2.Scope
是指程序中的一块区域,在此区域内,服务可以被使用它的组件共享。例如,程序中全局的静态的单例对象,它的范围是整个程序。而在for循环里创建的本地变量,它的范围就要小的多。
3.lifetime scope
Autofac 中的生命周期范围(lifetime scope)组合了这两个概念。实际上,可以把生命周期范围与应用程序中的工作单元等同起来。在工作单元的开始时创建生命周期范围,工作单元需要的服务从这个生命周期范围解析获得。解析服务时,Autofac 会跟踪实现 IDisposable 接口的组件。在工作单元结束时,清理(Dispose)生命周期范围,实现 IDisposable 接口的组件会同时被清理
二、Autofac学习之三种生命周期
InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例
SingleInstance:单例模式,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;
InstancePerDependency:默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象;
1.基础建设
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void Self()
{
Console.WriteLine("我叫{0}, 今年{1}岁了!", this.Name, this.Age);
}
}
2. Per Dependency
var builder = new ContainerBuilder();
builder.Register(c => new Person() { Name = "Elvin" }).InstancePerDependency();
var container = builder.Build();
var person1 = container.Resolve<Person>();
person1.Name = "person1";
var person2 = container.Resolve<Person>();
person2.Name = "person2";
person1.Self();
person2.Self();
3.Single Instance
这里将 InstancePerDependency 直接替换成 SingleInstance 就行了, 其他代码是一样的. 直接看结果:
4.Per Lifetime Scope
每一个lifetime内, 生成的对象都是同一个实例.
这个作用域适用于嵌套的生命周期。一个使用Per Lifetime 作用域的component在一个 nested lifetime scope内最多有一个实例。
当对象特定于一个工作单元时,这个非常有用。比如,一个HTTP请求,每一个工作单元都会创建一个nested lifetime,如果在每一次HTTP请求中创建一个nested lifetime,那么其他使用 per-lifetime 的component在每次HTTP请求中只会拥有一个实例。
var builder = new ContainerBuilder();
builder.Register(c => new Person() { Name = "Elvin" }).InstancePerLifetimeScope();
var container = builder.Build();
var person1 = container.Resolve<Person>();
person1.Name = "person1";
var person2 = container.Resolve<Person>();
person2.Name = "person2";
var inner = container.BeginLifetimeScope();
var person3 = container.Resolve<Person>();
person3.Name = "person3";
var person4= container.Resolve<Person>();
person4.Name = "person4";
person1.Self();
person2.Self();
person3.Self();
person4.Self();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构