2012-04-26 61 views
2

我正在尋找DI的簡單「Hello World」示例的一些幫助。我不明白的是如何在DI框架(autofac)中初始化類「Foo」和「Bar」。C#中的autofac「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

我想你的意思是你要解決一個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應用程序,但要小心,不要失敗到anti-pattern of using a service locator(即使用contain.Resolve所有的地方)。相反,請考慮允許您在同一地點進行所有註冊和解決的設計,名稱爲composition root

我提到這個警告,因爲這個級別的歧義(即爲給定接口註冊多個concreate類型)可能導致人們開始使用服務定位器模式。相反,在更復雜的應用程序中,請考慮重構您的API以避免解決註冊類型時的歧義。