2012-05-23 105 views
2

我目前使用Autofac做簡單的構造函數注入沒有任何問題。但是我想知道的是如何在運行時解決依賴關係。以下示例顯示了我們可以導出文檔的多種方式。通過簡單的構造函數注入,IExport的具體實現可以在運行時解決。然而,需要做的是從構建我的容器後發生的下拉列表中解析用戶選擇中的IExport。有沒有我可以如何實現這個目標的例子?Autofac綁定在運行時

Public interface IExport 
{ 
    void Run(string content); 
} 

public class PDFformat : IExport 
{ 
    public void Run(string content) 
    { 
     // export in pdf format 
    } 
} 

public class HTMLformat : IExport 
{ 
    public void Run(string content) 
    { 
     // export in html format 
    } 
} 

public class RTFformat : IExport 
{ 
    public void Run(string content) 
    { 
     // export in rtf format 
    } 
} 

public class HomeController : Controller 
{ 
    IExport Export; 

    public HomeController(IExport export) 
    { 
     Export = export; 
    } 

    public void ExportDocument(string content) 
    { 
     Export.Run(content); 
    } 
} 

對此的任何幫助將不勝感激。

回答

4

你應該使用一個工廠:

public interface IExportFactory 
{ 
    IExport CreateNewExport(string type); 
} 

實現:

class ExportFactory : IExportFactory 
{ 
    private readonly IComponentContext container; 

    public ExportFactory(IComponentContext container) 
    { 
     this.container = container; 
    } 

    public IExport CreateNewExport(string type) 
    { 
     switch (type) 
     { 
      case: "html": 
       return this.container.Resolve<HTMLformat>(); 
      // etc 
     } 
    } 
} 

報名:

builder.Register<IExportFactory>(
    c=> new ExportFactory(c.Resolve<IComponentContext>())))); 
builder.RegisterType<HTMLformat>(); 
builder.RegisterType<PDFformat>(); 

控制器:

public class HomeController : Controller 
{ 
    IExportFactory factory; 

    public HomeController(IExportFactory factory) 
    { 
     this.factory = factory; 
    } 

    public void ExportDocument(string content) 
    { 
     this.factory.CreateNew("html").Run(content); 
    } 
} 
+0

因此,我會在我的控制器中傳遞IExportFactory?當我通過容器在註冊時按照builder.Register ( container => new ExportFactory(container)); 我收到以下錯誤 無法從'Autofac.IComponentContext'轉換爲'Autofac.IContainer' – Cragly

+0

@Cragly:對不起。我不是Autofac專家。您可能需要注入'IComponentContext'(請參閱我的更新)。是的,您需要在'HomeController'中注入'IExportFactory'。 – Steven

+0

謝謝,得到它與以下修改註冊 - > builder.Register ( container => new ExportFactory(container.Resolve ())); – Cragly