.NET开源IOC内置容器,生命周期管理与Autofac扩展
大家好,我是行不更名,坐不改姓的宋晓刚,下面将带领大家从基础小白到高阶的.NET的IOC容器依赖与注入,以及IOC内置容器和生命周期,Autofac的学习,跟上我的步伐进入C#的世界。
微信:15319589104
QQ: 2981345658
文章内容:
.NET依赖注入容器的生命周期管理,瞬时生命周期(Transient Lifetime)、瞬时生命周期(Transient Lifetime)、作用域生命周期(Scoped Lifetime、Autofac扩展的安装与配置、Autofac是一个流行的开源依赖注入容器,它提供了丰富的扩展性和配置选项。通过安装Autofac NuGet包,您可以轻松地将Autofac集成到您的.NET项目中。配置Autofac主要包括注册服务和组件、配置生命周期和设置解析策略等步骤。
IOC内置生命周期
在C#中,生命周期指的是对象的创建和销毁过程。在讨论C#中的生命周期时,我们通常会涉及到瞬时生命周期、作用域生命周期和单例生命周期。这些生命周期模式定义了对象的创建和销毁时间,以及它们如何被使用。
下面会讲到IOC容器所支持的生命周期,瞬时生命周期AddTransient,作用域生命周期AddScoped,单例生命周期AddSingleton
瞬时生命周期AddTransient
概念:瞬时生命周期也称为短生命周期或隐式生命周期。这意味着对象在声明它的作用域内被创建,并在该作用域结束时自动销毁。
利用场景:瞬时生命周期常用于不需要长时间持有或需要自动释放资源的对象,例如文件流、数据库连接等。
案例:
1.0准备IOC.Interfaces,准备一个接口为IHeadphone
/// <summary>
/// 先定义接口
/// </summary>
public interface IHeadphone
{
}
1.1准备IOC.Services,准备一个是实现类Headphone,继承IHeadphone
public class Headphone : IHeadphone
{
public Headphone()
{
Console.WriteLine($"{this.GetType().Name}被构造。。");
}
}
1.2下面我们在UIL也就是主程序的控制台,进行编写
//1.瞬时生命周期,用AddTransient方法注册--每一次获取的对象的实例都是全新的实例
{
ServiceCollection serviceDescriptors = new ServiceCollection();
serviceDescriptors.AddTransient<IHeadphone, Headphone>();
//实例化对象了一次
IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
IHeadphone headphone1 = serviceProvider.GetService<IHeadphone>();
IHeadphone headphone2 = serviceProvider.GetService<IHeadphone>();
IHeadphone headphone3 = serviceProvider.GetService<IHeadphone>();
IHeadphone headphone4 = serviceProvider.GetService<IHeadphone>();
//生命周期相同为true,不同的话为false
Console.WriteLine($"headphone1 是否和 headphone1 同一个内存指向:{object.ReferenceEquals(headphone1, headphone1)}");
Console.WriteLine($"headphone2 是否和 headphone2 同一个内存指向:{object.ReferenceEquals(headphone2, headphone2)}");
Console.WriteLine($"headphone1 是否和 headphone3 同一个内存指向:{object.ReferenceEquals(headphone1, headphone3)}");
Console.WriteLine($"headphone1 是否和 headphone4 同一个内存指向:{object.ReferenceEquals(headphone1, headphone4)}");
}
运行结果为下:
作用域生命周期AddScoped
概念:作用域生命周期是指对象在其被声明的代码块(如方法、循环等)内存在的时间。当代码块执行完毕后,对象会自动离开作用域并可能被垃圾回收
利用:这种生命周期适用于不需要长时间持有或不需要显式管理生命周期的对象。如果对象仅在某个代码块中需要,则可以使用作用域生命周期。它也可以用于资源密集型对象,其中手动管理生命周期可能太复杂或容易出错。
案例:
//2.作用域生命周期:用AddScoped方法注册---同一个IServiceProvider获取的对象实例是同一个实例--内存指向是一样的
{
ServiceCollection serviceDescriptors = new ServiceCollection();
serviceDescriptors.AddScoped<IHeadphone, Headphone>();//瞬间生命周期的注册
//第一次对象实例化,实例化对象为headphone1和headphone2,调用了serviceProvider1
IServiceProvider serviceProvider1 = serviceDescriptors.BuildServiceProvider();
IHeadphone headphone1 = serviceProvider1.GetService<IHeadphone>();
IHeadphone headphone2 = serviceProvider1.GetService<IHeadphone>();
//第二次对象实例化,实例化对象为headphone3和headphone4,调用了serviceProvider2
IServiceProvider serviceProvider2 = serviceDescriptors.B
版权归原作者 上进的宋晓刚 所有, 如有侵权,请联系我们删除。