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、执行过程解读

  1. WriteDate方法创建一个生存周期期作用域,从中可以解析依赖项。它这样做是为了避免任何内存泄漏-如果IDateWriter或其依赖项是一次性的,那么在释放作用域时,它们将自动被释放。
  2. WriteDate方法从生存期范围手动解析IDateWriter。
    • Autofac看到IDateWriter映射到TodayWriter,因此开始创建TodayWriter
    • Autofac发现TodayWriter在其构造函数中需要一个IOutput。(这是“构造函数注入”。)
    • Autofac看到IIOutput映射到ConsoleOutput,因此创建一个新的ConsoleOutput实例。
    • Autofac使用新的ConsoleOutput实例来完成构建TodayWriter。
    • Autofac返回完全构造的TodayWriter供WriteDate使用。
  3. 对writer.WriteDate()的调用转到全新的TodayWriter.WriteDate()
  4. 释放Autofac生命周期作用域。在该生命周期作用域解析的项目也将被释放回收