2011-12-16 51 views
4

我知道這是一個加載的問題,可能有很多很多的答案,但.....我創建了一個小應用程序供我自己和其他幾個朋友現在使用,如果它更多人們喜歡它,我會分發給他們。這是一個簡單的應用程序來跟蹤健身人的客戶。它將跟蹤客戶,付款,付款歷史,日程安排,文件(照片,電子郵件等),也許還有更多,但總體來說是一個非常簡單的程序。哦,是的,使用SQLExpress作爲後端。我的問題是:什麼是設計這個應用程序所需的對象的最佳方法?我已經閱讀了關於數據訪問層和業務對象的文章,但從未真正從頭創建過。我正在考慮像客戶端,付款等對象,當然還有所有與它們一起使用的屬性,但在修改數據庫時,如果添加,更新,刪除等方法存在於對象中,或者它們會與剛剛傳入存儲過程名稱的對象一起駐留在DAL中?編程對象建議

我知道有很多信息可能丟失,但希望你能得到我想要做的事情的要點(sp?)。

**到的一些帖子作出迴應:

我有對象是單獨的dal,但我需要更多關於如何這樣再設計它......,新的閱讀同意面向對象編程,所以我不能完全看到整個畫面。

這裏有一個DAL一個朋友提出的,讓我用它:

namespace DataAccess{ 
public class SQLDataBase 
{ 
    public SQLDataBase(); 
    public SQLDataBase(string EncodedConnectionString); 
    public SQLDataBase(string EncodedConnectionString, int ConnectionTimeout); 

    public string ConnectionString { get; set; } 
    public int ConnectionTimeout { get; set; } 
    public string EncodedConnectionString { get; } 

    public void RunSpGetScaler(string spName, SqlParameter[] parms, ref DateTime ReturnValue); 
    public void RunSpGetScaler(string spName, SqlParameter[] parms, ref decimal ReturnValue); 
    public void RunSpGetScaler(string spName, SqlParameter[] parms, ref int ReturnValue); 
    public void RunSpGetScaler(string spName, SqlParameter[] parms, ref string ReturnValue); 
    public DataSet RunSpReturnDS(string DatasetName, string spName); 
    public DataSet RunSpReturnDS(string DatasetName, string spName, SqlParameter[] parms); 
    public int RunSpReturnRecordCount(string spName); 
    public int RunSpReturnRecordCount(string spName, SqlParameter[] parms); 
    public string RunSpReturnString(string spName, SqlParameter[] parms, string returnParm); 
    public SqlConnection RunSqlConnection(); 
} 

}

很簡單......我與它唯一的問題是,當我創建任何對象使用它,我必須寫在每次調用我做的DB方法....所以例如:

//Declarations - which I don't thinkk should be in the object itself 
    private DataAccess.SQLDataBase oDatabase = null; 
    private string sEncodedConnectionString = app.Default.EncodedDBString; 
    private int iConnectionTimeout = 15; 

    public DataSet GetClientInformation(int iClinetID, string sClientName) 
    { 
     oDatabase = new SQLDataBase(
      sEncodedConnectionString, iConnectionTimeout); 

     string spName = "GetClientInformation"; 
     string dsName = "GetClientInformation"; 

     try 
     { 
      SqlParameter[] Params = new SqlParameter[2]; 
      Params[0] = new SqlParameter("@ClientID", iClientID); 
      Params[1] = new SqlParameter("@ClientName", sClientName); 

      DataSet ds = oDatabase.RunSpReturnDS(dsName, spName, Params); 
      return ds; 
     } 
     catch (Exception e) 
     { 
      throw (e); 
     } 
    } 

所以我的客戶對象,我有這等多種方法添加,修改,或選擇數據爲「客戶」。從邏輯上講,這對我來說沒有任何意義,因爲看起來我無法使用它,而無需使用其他一些依賴項。

+2

將CRUD操作放入數據類對於測試目的不是一個好主意。你應該檢查出[存儲庫模式](http://stackoverflow.com/questions/3175/repository-pattern-tutorial-in-c-sharp)。 – Matthias 2011-12-16 02:05:11

回答

3

創建單獨的圖層可讓您的應用程序分離關注點。用戶界面(以及其他主機)訪問面向對象的模型,該模型在不知道數據存儲方式的情況下易於使用。在像MVC這樣的模式中,你甚至可以擁有一個在視圖和模型之間進行調節的控制器層。另一個非常好的模式,看看。

對象模型使用數據訪問層,並且不直接瞭解數據如何存儲和檢索。數據訪問層可能稍微平坦些,並且更關注於能夠高效地訪問和寫入數據。公共對象模型層需要是一個很好的面向對象層,您可以保持兼容。

圖層的其他原因:

  • 儘量減少客戶流失率的變化:您可以把您如何存儲,而影響的層,子系統數最少和代碼越好。
  • 測試:您可以模擬完整的圖層以單元測試高層。
  • 解耦實現:您可以從一個簡單的圖層開始(如文件等),同時等待其他層(或未來的開發)。
3

我會從閱讀和理解N層架構開始。這應該有助於你理解邏輯單元分離和抽象的需要。從那裏,如果您使用的是SQL Server和.NET,請查看Microsoft Entity Framework作爲您的數據訪問層。開始很簡單,而且功能強大。