autofacautofac入门


备注

Autofac是Microsoft .NET 4.5,Silverlight 5,Windows应用商店应用和Windows Phone 8应用的IoC容器 。它管理类之间的依赖关系,以便应用程序随着大小和复杂性的增长而易于更改。这是通过将常规.NET类视为组件来实现的。

来自维基百科
在软件工程中,控制反转(IoC)是一种设计原则,其中计算机程序的定制编写部分从通用框架接收控制流。与传统的过程编程相比,采用这种设计的软件体系结构颠倒了控制:在传统的编程中,表达程序目的的自定义代码调用可重用的库来处理通用任务,但是通过控制反转,它就是框架调用自定义或特定于任务的代码。

安装Autofac

要在项目中使用Autofac,您只需从NuGet Package Manager安装Autofac即可。打开想要使用Autofac的解决方案,然后选择Manager NuGet Packages for Solution... 转到:

Tools -> NuGet Package Manager -> Manager NuGet Packages for Solution...
 

NuGet-Solution 选项卡中,在搜索框中键入“Autofac”。确保您在“浏览”部分。安装第一个选项,如下图所示(记下图像中标记的区域):

的NuGet-autofac

通过NuGet安装将自动在安装期间选择的项目的参考中添加Autofac。

看看官方文档

设置Autofac

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

  1. File -> New -> Project -> Console Application 创建控制台应用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返回完全构造的TodayWriter for WriteDate() 以供使用。