设置 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()
使用。