2011-09-22 42 views
1

我有一個WinForms項目,它使用了大量的用戶控件。其中一些用戶控件使用來自業務邏輯層的類。這些類主要對數據庫執行CRUD操作(通過數據訪問層)以及一些額外的驗證和報告。在靜態類中存儲全局不可變數據

該項目使用的一些常見的物體(已登錄用戶,一些控制器和驗證器),其被實例化在主要形式,然後通過初始化方法或公共屬性注入到兒童用戶控件。這意味着我有很多代碼,只是將這些常用對象從父控件傳遞給子控件。

爲了避免這種情況,我可以創建一個靜態類(ApplicationContext的舉例)和所有的通用控件保存到它。這將發生在主窗體中,並且項目中的所有其他用戶控件或窗體都可以使用它。

我看到這種模式一般不鼓勵(存儲在靜態類的一些全局數據)。但如果這些數據是不可變的呢?這種方法是否是一個好主意?

或者你知道的任何其他方法,這可以幫助我擺脫所有的初始化代碼?

回答

2

您可以使用Inversion of Control容器,如UnityAutofac,並讓它自動連接您的對象圖。

您可以讓每個需要任何一個公共對象的對象通過構造函數參數或公共屬性定義對其接口的依賴關係,並且IoC容器將適當的對象連接在一起。

地產注入例如使用Unity:

public class MyUserControl : UserControl 
{ 
    [Dependency] 
    public LoggedUserService UserService { get; set; } 

    public void Method() 
    { 
     // the IoC container will ensure that the UserService 
     // property has been set to an object 
    } 
} 

所有你在主窗體要做的就是註冊共通對象你想要的IoC容器瞭解,然後你問根對象。該對象圖將爲您神奇地組裝起來,您不必爲所有線代碼也不在乎它是如何完成的。

+1

IoC容器就是我一直在尋找,謝謝。我選擇了ninject :) – sventevit

0

您可以使用靜態類來存儲一些不可改變的數據 - 這個沒問題。 如果你想在那裏存儲控件,它可能無法按預期工作。例如像OnDataBinding和Render的方法。

1

可以使用依賴注入/ IoC容器爲維護您的全局對象。 我已經與autofac library取得了很好的經驗,但還有很多其他可用的。 使用setter注入時,所有控件都會自動設置依賴對象集。

1

你會想在這種情況下使用單身人士。 Singletons將允許你使用你的對象的相同實例,比靜態更安全,更靈活。

public sealed class Singleton 
{ 
    public object Property1 {get;set;} 
    public void Method1(){} 

    static Singleton instance = null; 
    static readonly object padlock = new object(); 

    Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      lock (padlock) 
      { 
       if (instance==null) 
       { 
        instance = new Singleton(); 
       } 
       return instance; 
      } 
     } 
    }   
} 

那麼你可以使用它就像你靜態的,但有一點不同......

public class Main 
{ 
    public Main() 
    { 
     Singleton.Instance.Property1 = "somevalue"; 
     Singleton.Instance.Method1(); 
    } 

} 
+0

當他們不是不可變的時候,單身是不好的。隨時可以更改的全局狀態是一個很難解決的錯誤來源。 –

+0

你是對的,如果他改變的對象,而不是隻訪問它們。但是,我明白他是在Main中設置它們的,並且爲了避免傳遞這些不變的情況,他可以使用Singletons。 – bencobb

相關問題