2

我正在寻找有关 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;
        }
    }
}
4

1 回答 1

2

我认为你的意思是你想将一个BarFoo类解析为具体的实现,而不是实例化它。如果是这样,你可以写:

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 应用程序,但要小心不要陷入使用服务定位器的反模式(即到处使用 contains.Resolve)。相反,考虑允许您在同一个地方进行所有注册和解析的设计,命名为组合根

我提到这一点是因为具有这种程度的歧义(即为给定接口注册了多个创建类型)可能会导致人们开始使用服务定位器模式。相反,在更复杂的应用程序中,请考虑重构您的 API 以减少解析注册类型时的歧义。

于 2012-04-26T16:44:43.893 回答