AutoFac实现Demo1
1、创建一个工作台(.NET Core)程序AutofacDemo1,nuget引入AutoFac,搜索第一个就是
2、创建输出接口IOutput及实现ConsoleOutput
using System; using System.Collections.Generic; using System.Text; namespace AutofacDemo1 { public interface IOutput { void Write(string content); } }
using System; using System.Collections.Generic; using System.Text; namespace AutofacDemo1 { public class ConsoleOutput : IOutput { public void Write(string content) { Console.WriteLine(content); } } }
3、创建一个接口IDateWrite及实现类TodayWriter
using System; using System.Collections.Generic; using System.Text; namespace AutofacDemo1 { public interface IDateWriter { void WriteDate(); } }
using System; using System.Collections.Generic; using System.Text; namespace AutofacDemo1 { public class TodayWriter : IDateWriter { public IOutput _output;//将输出接口通过构造方法依赖注入 public TodayWriter(IOutput output) { this._output = output; } public void WriteDate() { this._output.Write(DateTime.Today.ToShortDateString()); } } }
4、在Program里做注册,依赖实例解析和创建
推荐从生命周期中解析服务,因为从根容器中解析组件(从根容器解析组件,组件的生命周期会和根容器的生命周期一致,迟迟得不到dispose,造成内存泄漏),有可能会导致内存泄露
using Autofac; using System; namespace AutofacDemo1 { class Program { //创建一个容器属性,待会儿我们会用到 private static IContainer Container { get; set; } static void Main(string[] args) { Console.WriteLine("Hello Autofac!"); //ContainerBuilder容器创建对象 var builder = new ContainerBuilder(); //做相关的依赖注册 builder.RegisterType<ConsoleOutput>().As<IOutput>(); builder.RegisterType<TodayWriter>().As<IDateWriter>(); //ContainerBuilder的Build()方法可以创建容器 Container = builder.Build(); WriteDate(); } //生命周期作用域 //生命周期作用域是可释放的并且追踪组件的释放, 因此确保你总是调用了 “Dispose()”" 或者把它们包裹在 “using” 语句 public static void WriteDate() { //调用 BeginLifetimeScope() 方法来创建另一个生命周期作用域 using (var scope = Container.BeginLifetimeScope()) { //用生命周期作用域解析获取IDateWriter对应的依赖对象实例 var writer = scope.Resolve<IDateWriter>(); writer.WriteDate(); } } } }
5、执行过程解读
- WriteDate方法创建一个生存周期期作用域,从中可以解析依赖项。它这样做是为了避免任何内存泄漏-如果IDateWriter或其依赖项是一次性的,那么在释放作用域时,它们将自动被释放。
- WriteDate方法从生存期范围手动解析IDateWriter。
- Autofac看到IDateWriter映射到TodayWriter,因此开始创建TodayWriter
- Autofac发现TodayWriter在其构造函数中需要一个IOutput。(这是“构造函数注入”。)
- Autofac看到IIOutput映射到ConsoleOutput,因此创建一个新的ConsoleOutput实例。
- Autofac使用新的ConsoleOutput实例来完成构建TodayWriter。
- Autofac返回完全构造的TodayWriter供WriteDate使用。
- 对writer.WriteDate()的调用转到全新的TodayWriter.WriteDate()
- 释放Autofac生命周期作用域。在该生命周期作用域解析的项目也将被释放回收
分类:
Autofac
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?