設定 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() 使用。