2

DIの簡単な「HelloWorld」の例について助けを求めています。私が理解していないのは、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

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 アプリケーションであることも認識していますが、サービス ロケーターを使用することのアンチ パターン(つまり、あらゆる場所での container.Resolve の使用)に陥らないように注意してください。代わりに、コンポジション ルートという名前の同じ場所ですべての登録と解決を行うことができる設計を検討してください。

このレベルのあいまいさ (つまり、特定のインターフェイスに複数の concreate 型が登録されている) があると、サービス ロケーター パターンの使用を開始する可能性があるため、この注意を述べます。代わりに、より複雑なアプリケーションでは、API をリファクタリングして、登録された型を解決する際のあいまいさを少なくすることを検討してください。

于 2012-04-26T16:44:43.893 に答える