設定 Autofac
這個例子將展示如何使用 Autofac 開始使用一個相對簡單的專案進行 Inverion of Control ,緊跟官方入門文件。
-
從
File -> New -> Project -> Console Application
建立一個控制檯應用程式 -
為此專案安裝 Autofac。你可以看一下安裝 Autofac
-
新增 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 來自動注入依賴項。
以下是幕後發生的事情:
-
在應用程式啟動時,我們正在建立一個
ContainerBuilder
並使用它註冊我們的元件。簡單來說,元件是實現介面的 .NET 型別,因此公開了一些服務。閱讀服務與元件 。 -
然後,我們使用它們公開的服務(介面) 註冊我們的元件(類)。註冊後,Autofac 會在要解析介面時知道要建立的類的哪個例項。
-
最後,當我們執行程式時:
WriteDate()
方法(在Main()
中)要求 Autofac 提供IDateWriter
。- Autofac 認為
IDateWriter
對映到TodayWriter
所以開始建立一個TodayWriter
。 - Autofac 認為
TodayWriter
在建構函式中需要一個IOutput
。 - Autofac 看到
IOutput
對映到ConsoleOutput
,因此建立了一個新的ConsoleOutput
例項。 - Autofac 使用新的
ConsoleOutput
例項來完成TodayWriter
的構建。 - Autofac 返回完整構造的
TodayWriter
供WriteDate()
使用。