2013-05-10 44 views
4

讓我們假設一個主窗體有幾個菜單項。每個菜單項都會顯示另一種形式。下面的代碼是在這種情況下執行依賴注入的好方法嗎?在具有子表單的WinForms應用程序中執行依賴注入

public class MainForm: Form { 
    private IAboutForm _aboutForm; 
    private IOptionsForm _optionsForm; 
    private IDownloadsForm _downloadsForm; 

    MainForm(IAboutForm aboutForm, IOptionsForm optionsForm, IDownloadsForm downloadsForm) { // add as many form dependencies as required 
    _aboutForm = aboutForm; 
    _optionsForm = optionsForm; 
    _downloadsForm = downloadsForm; 

    InitializeComponent(); 
    } 

    private void AboutMenuItem_Click(object sender, System.EventArgs e) { 
    _aboutForm.ShowDialog(this); 
    } 

    private void DownloadsMenuItem_Click(object sender, System.EventArgs e) { 
    _downloads.Show(); 
    _downloads.BringToFront(); 
    } 

} 
+0

@Gjeltema,是的! :) – fxam 2013-05-13 01:32:02

回答

8

這工作正常原樣,但不延長好 - 如果你繼續補充形式的構造函數將成爲一段時間後巨大。如果你再也不添加任何東西,那麼你可能沒問題。如果你知道你將增加更多的,或者不認爲你會,但最終這樣做,你可能需要注入一些的IFormFactory排序代替,就像這樣:

IFormsFactory formsFactory; 
MainForm(IFormsFactory formsFactory) 
{ 
    _formsFactory = formsFactory; 
} 

那麼你可以創建依賴表格根據需要:

private void AboutMenuItem_Click(object sender, System.EventArgs e) { 
    IAboutForm aboutForm = _formsFactory.CreateAboutForm(); 
    aboutForm.ShowDialog(this); 
} 

有幾種方法可以解決這個問題。您可以將所有表單保存爲成員變量,只需使用注入的工廠在構造函數中創建它們即可。如果性能是一個問題,這是很好的,並且在程序的整個生命週期中,每個程序只需要一個實例。

請注意,如果需要,也可以將「構造」參數添加到factory.CreateXXX()調用中。

在工廠內部,它會知道如何創建每個表單。如果您使用IoC容器,則甚至不需要創建IFactory接口的具體內容。如果有特殊的邏輯來創建一個表單,那麼你可能想創建一個混凝土,並將注入的IFactory解析爲該具體。

對此有很多可以說,但這是我認爲的一個很好的起點。希望能幫助到你。

相關問題