2011-12-16 8 views
4

これはロードされた質問であり、多くの、多くの回答がある可能性があると知っていますが、私は自分自身と他のいくつかの友人によって使用される小さなアプリケーションを作成しています。それが好きな人は、私はそれらに配布します。これは、フィットネスの人々のためのクライアントを追跡するためのシンプルなアプリです。それは、クライアント、支払い、支払い履歴、スケジュール、ファイル(写真、電子メールなど)を追跡し、多分より多くのしかし全体的に非常に単純なプログラムです。ああ、SQLExpressをバックエンドとして使用する。私の質問はこれです:このアプリケーションに必要なオブジェクトを設計するための最良のアプローチは何ですか?私はデータアクセスレイヤーとビジネスオブジェクトについての記事を読んだことがありますが、まったく新しいものを作成したことはありません。私はClient、Paymentなどのオブジェクトを持っていると思っていましたが、もちろんそれらに付随するすべてのプロパティがありますが、DBの変更に関しては、追加、更新、削除などのメソッドをオブジェクトに入れるか、オブジェクトがストアドプロシージャ名を渡すだけで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

+0

エンティティフレームワークは、これであなたが探しているものであるように思えます。 Visual Studioを使用すると、ロード、保存などの方法とともに、データアクセスオブジェクトが自動的に生成されます。 – jermny

答えて

3

別々のレイヤーを作成することで、アプリケーションで懸念事項を分けることができます。 UI(および他のホスト)は、データの格納方法を知らなくても簡単に使用できるオブジェクト指向モデルにアクセスします。 MVCのようなパターンでは、ビューとモデルの間を仲介するコントローラレイヤーを持つことさえできます。調べる別の非常に良いパターン。

オブジェクトモデルはデータアクセスレイヤーを使用し、データの格納および取得方法を直接的に把握していません。データアクセス層は、少しだけ平坦であり、より効率的にデータにアクセスし、書き込むことに重点を置くことができる。パブリックオブジェクトモデルレイヤーは、おそらく互換性を維持できる素敵なオブジェクト指向のレイヤーである必要があります。層のための

その他の理由:

  • 変更に解約を最小化:あなたは、できるだけ層、サブシステムとコードの最小数に影響を与えながら、あなたは保存方法を入れ替えることができます。
  • テスト:完全なレイヤーをユニットテストの上位レイヤーにモックすることができます。
  • デカップル実装:他のレイヤー(または将来の開発)を待っている間に、単純なレイヤー(ファイルなど)から始めることができます。
3

まず、N層アーキテクチャを読んで理解します。これは、論理ユニットの分離と抽象化のニーズを理解するのに役立ちます。そこから、SQL Serverと.NETを使用している場合は、Microsoft Entity Frameworkをデータアクセスレイヤーとして調べます。それは簡単に始めることができ、かなり強力です。