2009-08-03 107 views
2

我有一個Windows窗體應用程序,當前在啓動時加載數據庫。流程如下:WinForms應用程序中的初始化代碼 - Program.cs或MainForm?

Program.cs => Application.Run(new MainForm()); => MainForm構造函數=>打開數據庫

所以基本上MainForm保存所有讓應用程序運行的零碎,而Program.cs只是一個存根。目前,加載的數據庫的名稱是硬編碼的,我想添加功能來指定要通過命令行加載的數據庫的名稱。同時,我想添加一些單元測試甚至依賴注入的能力,所以我想知道哪種方法是推薦的?

  • 更改MainForm的構造函數以接受一些參數。然後換Program.cs的讀取命令行並更改呼叫Application.Run(new MainForm());相應
  • 離開的Program.cs和構造不變的簽名和檢查命令行中的MainForm
  • 的構造

方法一,似乎更清潔,因爲它允許即測試運行器創建一個測試數據庫的MainForm,但因爲我通常不是一個WinForms開發人員,我不知道是否可能有副作用,沒有在主窗體上的默認構造函數或如果有更好的方法?

回答

5

我認爲這歸結爲一個問題的分離。 Program類應該關注應用程序級別的細節和MainForm以及表單細節。然後,這對我說,該程序應解析命令行並將名稱傳遞給表單。

您仍然可以將默認構造函數保留在窗體上,並將其標記爲private或在執行時拋出錯誤。或者你還可以有Program.cs中使用默認的構造函數來創建表格,只需用paramters注入數據庫名稱(所以它要麼構造函數注入或參數注入),像

 
form = new MainForm(); 
form.DbName = "foo"; 
Application.Run(form); 
2

目前,我配置的依賴內的Program.cs注入容器,然後說

Application.Run(container.GetInstance<Form>()); 

我們目前正在開發的應用程序具有80種不同的應用程序部分。我們目前的MainForm在95行代碼個時鐘,具有依賴於IApplicationModule(一個接口,其唯一的財產是返回一個「TopControl」),一個MenuStripModule,一個StatusBarModule會話對象。

0

您可以創建一個Singleton對象(或延遲初始化),用於管理數據庫,並在代碼的任何部分初始化:

public class DBProvider() 
{ 
    private static string DefaultConnectionString = "some connection string"; 
    private static DBProvider instance 
    public static DBProvider GetInstance() 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new DBProvider(DefaultConnectionString); 
      } 
      return instance; 
     } 
    } 

    public DBProvider(string Connection string) 
    { 
     ... 
    } 


    public static void Initialize (string ConnectionString) 
    { 
     instance = new DBProvider(ConnectionString); 
    } 
} 

而且你可以在Program.cs中或在MainForm的構造函數和使用初始化DBProvider.GetInstance();