设置 Autofac

这个例子将展示如何使用 Autofac 开始使用一个相对简单的项目进行 Inverion of Control ,紧跟官方入门文档。

  1. File -> New -> Project -> Console Application 创建一个控制台应用程序

  2. 为此项目安装 Autofac。你可以看一下安装 Autofac

  3. 添加 2 个接口和 2 个类,具有以下名称:

      Interfaces  |  Classes
    --------------------------
    IOutput       | ConsoleOutput (implementing IOutput)
    IDateWriter   | TodayWriter (implementing IDateWriter)
    

为简单起见,未显示 using 语句和命名空间。

IOuput.cs

public interface IOutput
{
    void Write(string content);
}

ConsoleOutput.cs

public class ConsoleOutput : IOutput
{
    public void Write(string content)
    {
        Console.WriteLine(content);
    }
}

IDateWriter.cs

public interface IDateWriter
{
    void WriteDate();
}

TodayWriter.cs

public class TodayWriter : IDateWriter
{
    private IOutput _output;

    public TodayWriter(IOutput output)
    {
        _output = output;
    }

    public void WriteDate()
    {
        _output.Write(DateTime.Today.ToShortDateString());
    }
}

到目前为止,代码简单明了。让我们来到自动依赖注入发生的部分,这当然是由 Autofac 完成的!

使用此代码替换 Program.cs 文件中的 Program 类(在创建项目时,Visual Studio 会自动创建 Program 类。如果它不存在,请继续创建一个):

class Program
{
    private static IContainer Container { get; set; }

    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<ConsoleOutput>().As<IOutput>();
        builder.RegisterType<TodayWriter>().As<IDateWriter>();
        Container = builder.Build();

        WriteDate();
    }

    public static void WriteDate()
    {
        using (var scope = Container.BeginLifetimeScope())
        {
            var writer = scope.Resolve<IDateWriter>();
            writer.WriteDate();
        }
    }
}

运行时,输出应该是控制台中的当前日期。你已在项目中成功使用 Autofac 来自动注入依赖项。

以下是幕后发生的事情:

  1. 在应用程序启动时,我们正在创建一个 ContainerBuilder 并使用它注册我们的组件。简单来说,组件是实现接口的 .NET 类型,因此公开了一些服务。阅读服务与组件

  2. 然后,我们使用它们公开的服务(接口) 注册我们的组件(类)。注册后,Autofac 会在要解析接口时知道要创建的类的哪个实例。

  3. 最后,当我们运行程序时:

    • WriteDate() 方法(在 Main() 中)要求 Autofac 提供 IDateWriter
    • Autofac 认为 IDateWriter 映射到 TodayWriter 所以开始创建一个 TodayWriter
    • Autofac 认为 TodayWriter 在构造函数中需要一个 IOutput
    • Autofac 看到 IOutput 映射到 ConsoleOutput,因此创建了一个新的 ConsoleOutput 实例。
    • Autofac 使用新的 ConsoleOutput 实例来完成 TodayWriter 的构建。
    • Autofac 返回完整构造的 TodayWriterWriteDate() 使用。