2013-01-31 65 views
3

我在Windows窗體應用程序中使用了Unity DI。據工作至今解析相關的主要形式Program.cs中是這樣的:Windows窗體中帶有子窗體的Unity DI

static void Main() 
{ 
    IUnityContainer container = new UnityContainer(); 
    container.AddNewExtensionIfNotPresent<EnterpriseLibraryCoreExtension>(); 
    container.RegisterType<IAccountService, AccountService>(); 
    container.RegisterType<IAccountRepository, AccountRepository>(); 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(container.Resolve <MainForm>()); 
} 

我的問題是,當我的MainForm嘗試創建一個子窗體:

ChildForm childForm = new ChildForm(); 
    childForm.Show(); 

我得到一個錯誤,因爲我試圖使用構造函數注入,我沒有傳入構造函數參數。我也試着用[Dependency]屬性使用setter注入,但那也不起作用。我應該如何做到這一點?我可以讓我的主窗體擁有所有的依賴關係,並將所需的對象傳遞給子窗體,但是如果我最終有許多子窗體,那麼主窗體就會變得混亂。

回答

2

爲了讓Unity注入構造函數參數,您需要使用容器來解析子窗體。所以,你需要的地方堅持你的容器的引用,然後調用:

ChildForm childForm = container.Resolve<ChildForm>(); 

這將允許統一評估ChildForm構造並注入相應的依賴關係。

+0

謝謝,我沒有意識到我可以使容器成爲program.cs的公共屬性並在我的表單中引用它。你的回答幫助我看到了它。 – flyingeagle

+0

這種氣味非常像服務定位器 –

3

在上面的註釋中,您提到「mak容器是program.cs的公共屬性」。

不要這樣做。

如果您的表單對容器有依賴關係,請像處理其他依賴項那樣對待它。

  • 將容器添加到容器。
  • 使用屬性或ctor注入來使窗體訪問容器。

    static void Main() 
    { 
    
        IUnityContainer container = new UnityContainer(); 
    
        container 
         .RegisterType<MainForm>() 
         .RegisterInstance<IUnityContainer>(container); 
    

public partial class MainForm: Form 
    { 
     [Dependency] 
     public IUnityContainer Container { get; set; }