質問

自分のプロジェクトの1つにデータアクセス用のクラスがたくさんありますが、これらのクラスは、データリーダーからデータを取得するコードのために非常に大きくなっています。

通常、私のコードは次のようになります:

// Execute the data reader
using (DbDataReader reader = command.ExecuteReader())
{
  while (reader.Read())
  {
     obj = this.FillDataReader(reader);
     objlist.Add(obj);
  }
}

internal SomeObject FillDataReader(IDataReader dr)
{
   SomeObject obj = new SomeObject ();


   if (!dr.IsDBNull(dr.GetOrdinal("objectID")))
   {
     obj.ID = dr.GetInt32(dr.GetOrdinal("objectID"));
   }

   return obj;
}

Fillメソッドの中には、400行以上を簡単にヒットするものがありますが、これらを区別する適切な方法はありますか?部分クラスは受け入れられますか?理想的な世界では、ORMを使用しますが、残念ながらORMの使用方法を学ぶ時間はありません。

役に立ちましたか?

解決

確かに、部分クラスを使用して、Fillメソッドのコードを分割できます。テンプレートシステムを使用してこれらの部分クラスファイルを生成することもできます。

とは言っても、ORMはより単純なソリューションであり、ニーズが単純であれば、実際に解決するのにそれほど時間はかかりません。

細かな制御を必要としない基本的なニーズの場合、LINQ to SQLはうまく機能しますが、VS 2010 / .NET 4の一部として更新されると多くの人が考えていたのとは反対になります。

別のオプションはEntity Frameworkです。これもVS 2010 / .NET 4の一部として更新されます。これにより、より多くの制御が可能になりますが、もう少し学習が必要になる場合があります。

これらの400行以上のFillメソッドを作成するのにどれくらい時間がかかりますか?その時間をORMの学習に使用できなかったと確信していますか? Cookie-cutterコード(ADO.NET Fillメソッドなど)を絶えず書くことを強いられると感じるプログラマーはいません。プログラミングから喜びを素早く奪うことができます!

他のヒント

部分クラスはコードの分離に役立ちますが、ファイルは同じプロジェクト内にある必要があります。 これが必要ない場合は、データアクセスクラスから新しいクラスを継承するだけではどうですか?

値を抽出するコードをデータリーダーからヘルパークラスまたは拡張メソッドに移動できます。

例:

 public int GetIntOrDefault(this DataReader dr, string fieldName, int defaultValue){
     var value = dr.GetOrdinal(fieldName);
     return (!dr.IsDBNull(value)) ? dr.GetInt32(value) : defaultValue;
 }

 internal SomeObject FillDataReader(IDataReader dr)
 {
    SomeObject obj = new SomeObject ();
    obj.ID = dr.GetInt32OrDefault("objectID", 0); // 1 line instead of 4
    ...
    return obj;
 }

ORMを試してみることをお勧めしますが、これによりしばらくの間は改善されます。 rawに多くを投資しているので、 IBatis はアプリで簡単に使用できるようです。 SQL。また、他の多くのORMも簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top