2009-03-04 10 views
3

私はデータアクセスレイヤーデザイン用の.Netエンタープライズライブラリーデータアクセスアプリケーションブロックを使用しています。私のカテゴリーDALクラスでデータアクセスレイヤー(DAL)デザイン

、私のような方法できた:など

GetProductsInCategory(int型のCATID)、GetAllProducts、GetCategories、

を私の質問は:どこ私はこのコード行を置くのですか?

DatabaseFactory.CreateDatabase("MyDB"); 

上記のすべての方法に入れてください。または、DALクラスにデータベースオブジェクトを返すベースクラスを用意しますか?

また、これらのDALクラスのメソッドを静的に保つ必要がありますか?

答えて

3

データベースの例では、接続のような共通のオブジェクトを返す基本クラスが好きです。

.NET Application Architecture: the Data Access Layerは私がマイクロソフトエンタープライズライブラリデータアクセスアプリケーションブロックを使用します。ここでは

は、最新デザインデータアクセス層への参照です。ここで言及されているほとんどのことを行います。接続やトランザクションのような一般的なものは私の基本クラスに行きます。

alt text

DataServiceBaseクラスは、データベース接続を開く 等 共通のデータアクセス機能を提供 は、トランザクションの管理、等 ストアドプロシージャのパラメータ、 コマンドを実行し、セットアップ。 という単語では、DataServiceBaseクラス には一般的なデータベースコードが含まれており、 には、個々のデータサービスクラスで使用するヘルパー メソッドのセットが用意されています。派生データ サービスクラスは、特定の コマンドの実行や特定のクエリの実行など、特定の の目的のためにDataServiceBaseのヘルパーメソッド を使用します。

+0

基本クラスがある場合、派生クラスは 'protected Database _myDatabase'にアクセスできるだけなので、ファクトリメソッドは必要ありません。 –

+0

@Ian Quigley:はい、保護されたデータベース_myDatabaseをインスタンス化する必要があります。そのため、基底クラスのコンストラクタでファクトリクラスが必要です。 – Canavar

+0

ur tips..iに感謝します。ベースクラスDBManagerから派生したすべてのDALクラスを取得します。このクラスには、コードを持つGetDatabase()という保護されたメソッドがあります: return DatabaseFactory.CreateDatabase( "MyDB"); 派生クラスのメソッドは次のようになります。...(次のコメントに続く) –

1

ウルtips..iためのおかげで、基本クラスDBManager.Thisクラスから派生したすべての私のDALクラスを持つことになりますGetDatabase(と呼ばれる保護されたメソッドを持つことになります)コード持っているであろう:返すDatabaseFactory.CreateDatabase(「mydbというの」 );そして、私の派生クラスのメソッドは、次のようになります:..

public DataSet GetProductsInCategory(int Category) 
{ 
Database db = base.GetDatabase(); 
DbCommand dbCommand = db.GetStoredProcComman("GetProductsByCategory"); 
db.AddInParameter(dbCommand, "CategoryID", DbType.Int32, Category); 
return db.ExecuteDataSet(dbCommand); 
} 

このDALデザインは見た目がいいですか?

+0

はい、大丈夫です。 – Canavar

0

私は、DALとオブジェクト生成のためにSubSonicを使用することを検討することをお勧めします。 MicrosoftのApplication Blockを実装していますが、単純な(そして堅牢な)クエリ機能を提供します。

SubSonic.Query qry = new SubSonic.Query(Usr.Schema); 
qry.SetSelectList(Usr.Columns.UserPkid); 
qry.QueryType = SubSonic.QueryType.Select; 
qry.AddWhere(Usr.UsernameColumn.ColumnName, SubSonic.Comparison.Equals, Username); 

using (IDataReader reader = qry.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     Trace.WriteLine("Fetched User Pkid [" + reader[Usr.Columns.UserPkid].ToString() + "]"); 
    } 
} 

とオブジェクトクラスは.Delete()、.Add()に.get()型のメソッドを持っているので、もちろんそれはActiveRecordパターンを実装します。

関連する問題