2010-04-29 65 views
6

我想弄清楚如何解決代碼中某處的實例。解決實例 - Autofac

在應用程序啓動時我註冊了一個類型

static void Main() 
{  
    var builder = new ContainerBuilder(); 
    builder.RegisterType<Foo>().As<IFoo>(); 
} 

現在,我怎麼能在某處代碼解決一個實例?

在StructureMAP有上Getting Started閱讀了靜態對象ObjectFactory.GetInstance<IFoo>()

回答

10

。它應該讓你開始。

首先,你要找的是container。從ContainerBuilder想在這個簡單的WinForms應用程序構建:

static void Main() 
{ 
    using (var container = builder.Build()) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     var mainForm = container.Resolve<MainForm>(); 
     Application.Run(mainForm) 
    } 
} 

總的想法是,你只需要解決第一或最上面的實例。容器將通過構造函數參數來處理創建所有其他基於依賴注入的實例。

如果在整個應用程序中遵循DI模式,那麼在啓動時只需觸摸容器一次。

您如何解決最高層實例很大程度上取決於您正在構建的應用程序類型。如果它的網絡應用程序,ASP.Net integrationMVC integration將爲您照顧它。 (畢竟,ASP.Net中最頂層的實例是Application,這是我們無法控制的)。另一方面,如果它的控制檯應用程序或WinForms應用程序,您可以在Main中手動解析第一個實例,就像我上面的示例一樣。

+0

這就是例子,但是如果我需要更多類中的實例?無法在每個班級中註冊該類型。 – user137348 2010-04-29 13:13:08

+1

但是你必須以某種方式解決代碼中某個地方的最高層實例。這些類型會在啓動時註冊(Global.asax),然後您需要解析代碼中某處的最頂層實例。最後,我找到了一篇描述這一點的文章。 http://geekswithblogs.net/Sharpoverride/archive/2009/08/15/ioc-in-.net-part-1-autofac.aspx 您對這種方法有什麼看法? – user137348 2010-04-30 08:02:42

+0

查看我的更新回答...是的,@Sharpoverrides方法沒問題,它確保Global.asax不會與容器構建代碼混雜在一起。畢竟,你真的應該編寫測試容器的單元測試,並且有一個構建容器的單一責任類可以更容易測試。 – 2010-04-30 09:52:20