2012-04-26 5 views
2

DIの簡単な "Hello World"の例をいくつか参考にしています。私が理解できないことは、DIフレームワーク(autofac)内でクラス "Foo"と "Bar"を初期化する方法です。Cの自動ファンク "Hello World"アプリ - 初期化

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; 
     } 
    } 
} 

答えて

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(); 

を私はまた、これはハロー世界のアプリケーションですが、(あらゆる場所にcontain.Resolveを使用して、すなわち)anti-pattern of using a service locatorに失敗しないように注意して実現しています。代わりに、すべての登録と解決が同じ場所で行われるようにするデザインを考えてみましょう。名前はcomposition rootです。

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