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生命周期作用域。在该生命周期作用域解析的项目也将被释放回收