我正在寻找有关 DI 的简单“Hello World”示例的帮助。我不明白的是如何在 DI 框架(autofac)中初始化类“Foo”和“Bar”。
namespace AutofacTesting
{
//these classes are intended to be used with autofac / DI
public interface IFooBar
{
void Draw();
}
public class Bar : IFooBar
{
public void Draw()
{
MessageBox.Show("Drawing something in Bar");
}
}
public class Foo : IFooBar
{
public void Draw()
{
MessageBox.Show("Drawing somthing in Foo");
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
var builder = new ContainerBuilder();
builder.RegisterType<Bar>().As<IFooBar>();
builder.RegisterType<Foo>().As<IFooBar>();
var container = builder.Build();
var taskController = container.Resolve<IFooBar>();
taskController.Draw();
int a = 1;
}
}
}
最佳答案
我认为您的意思是您想要将 Bar
或 Foo
类解析为具体实现,而不是实例化它。如果是这样你可以写:
var builder = new ContainerBuilder();
builder.RegisterType<Bar>().Named<IFooBar>("Bar");
builder.RegisterType<Foo>().Named<IFooBar>("Foo");
var container = builder.Build();
var taskController = container.ResolveNamed<IFooBar>("Bar");
taskController.Draw();
我也意识到这是一个 hello world 应用程序,但要小心不要失败到 anti-pattern of using a service locator (即到处使用 contains.Resolve )。相反,请考虑允许您在同一个位置进行所有注册和解析的设计,名为 composition root .
我提到这一点是因为这种程度的模糊性(即为给定接口(interface)注册多个concreate类型)可能会导致人们开始使用服务定位器模式。相反,在更复杂的应用程序中,请考虑重构您的 API,以减少解析注册类型时的歧义。
关于dependency-injection - C# 中的 autofac "Hello World"应用程序 - 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10335789/