2014-10-10 31 views
0

我正在開發一個小型的實用程序Winforms應用程序。它只是轉換一個加載到內存的文件。沒有數據庫。沒有數據庫的Winforms:使用相同有狀態類的不同表格

有一個表示該文件的有狀態類。它基本上是應用程序的數據源來代替數據庫。該類中的數據需要通過應用程序中的幾種不同形式來讀取/修改。

我該如何構建此應用程序以確保表單可以輕鬆地與該類進行通信。我的主要表單是否可以簡單地將對象傳遞給它的子表單,還是那種不好的做法?有更好的選擇嗎?

感謝

回答

2

通過你的應用程序狀態對象的實例,以孩子的形式是可以接受的。或者,你可以使用Singleton Pattern編寫你的狀態類,這樣它就被實例化了一次(並且只有一次)。

public class MyState 
{ 
    // private constructor to stop others from instantiating the object 
    private MyState() { } 

    private static MyState instance; 

    public static MyState Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new MyState(); 
      } 

      return instance; 
     } 
    } 

    // Insert the class' methods/properties here as public, non-static 
} 

你也可以使用一個Dependency Injection庫提供您的狀態類子窗體。我喜歡Autofac,但還有很多其他的。

最終,最好的做法是編寫適合您應用程序需求的代碼。

0

最簡單的方法就是要對靜態訪問器類,它提供了訪問類爲您的整個應用程序,如:

public static class AppObjects 
{ 
    private static MyClass _myClass; 

    public static GetMyClass() 
    { 
     if(_myClass == null) 
     { 
      //Init/Load Object 
     } 
     return _myClass 
    } 
} 

這就是說,它是不可怕有父窗體通它的對象是子窗體。如果您希望改變相關的東西(比如您的UI結構或所需的對象數量),您只需要使用更復雜的解決方案。

0

您可以創建一個簡單的實例存儲庫。這樣做的邏輯是你可以從集合中檢索安裝,你還應該提供一個添加方法來添加一個實例。

樣品將

 private List<object> _instanceRepo; 

    public TInstance Retrieve<TInstance>() 
    { 
     TInstance response = default(TInstance); 
     object retrieved = _instanceRepo.FirstOrDefault(x => x.GetType() == typeof(TInstance)); 
     if (retrieved == null) 
      Console.WriteLine("retrieved object was null."); 
     else 
      response = (TInstance)retrieved; 

     return response; 
    } 

或創建一個單,這是通過使暴露的單一實例類的靜態屬性來實現的。

讀取的廠家在這裏:Factory 讀單位置:Singleton

+0

也許更新您的代碼示例拋出一個異常或東西,而不是'Console.WriteLine',作爲OP使用'WinForms' – rhughes 2014-10-10 02:53:44

+0

@rhughes好,無論如何,它並不意味着被複制:D,使它變成這樣,所以OP可以做一些事情而不是普通的複製麪食。 – DevEstacion 2014-10-10 03:32:40

相關問題