私は最近、UIレイヤーからほとんど同じことを切り離しながら、これを経験しました。
こことここで私の進捗状況を見ることができます。
私の意見では、Aはビジネスロジックを表しDataTable
ていません。具体的には、データベースから直接取得したデータです。ビジネスロジックは、そのデータを真に有用なビジネスオブジェクトに変換します。
したがって、最初のステップは、DataTableをBusinessオブジェクトから切り離すことです。
List<object>
これを行うには、DataTablesとDataTablesのコレクションを構成するオブジェクトを作成してから、それらのオブジェクトを表示するListViewを作成します。後の手順については、上記のリンクで説明しています。そして、前の手順は次のように簡単です。
- オブジェクトを表すクラスを作成します。
- DataTable(またはDataSet、またはデータを取得する方法)を反復処理し、それらのフィールドをそのオブジェクト(またはその
List<T>
)のプロパティに押し込みます。
- そのリストをGridviewまたはListViewに戻して表示します。
このように、ListViewまたはGridviewは、データを取得するメソッドと緊密に結合されません。後でJSONクエリまたはXMLファイルからデータを取得することにした場合はどうなりますか?次に、これをそこに組み込む必要があります。
ステップ1-データベースからデータを取得する
データベースからデータを取得する方法は複数ありますが、ここでそれらすべてを調べる方法はありません。データベースからデータを取得する方法をすでに知っていると思いますが、知らない場合は、たどるリンクがかなりあります。SQLDataReader
データベースに接続し、を使用してデータを取得しているとしましょう。そこで迎えに行きます。
クラス図
Foo
----
id
Name
Description
そして、これが方法です:
private void FillDefault(SqlDataReader reader, Foos foo)
{
try
{
foo.id = Convert.ToInt32(reader[Foo.Properties.ID]);
foo.Name = reader[Foo.Properties.NAME].ToString();
if (!string.IsNullOrEmpty(
reader[Foo.Properties.DESCRIPTION].ToString()))
foo.Description =
reader[Foo.Properties.DESCRIPTION].ToString();
else foo.Description = string.Empty;
}
catch (Exception ex)
{
throw new Exception(
string.Format("Invalid Query.
Column '{0}' does not exist in SqlDataReader.",
ex.Message));
}
}
それが発生したらwhile
、関数を対象とするループでそのプロセスを実行することにより、リストを返すことができSQLDataReader.Read()
ます。
それが済んだら、Foo
返されるのがリストであるとしましょう。それを行い、上記の最初のリンクをたどると、置き換えDictionary<TKey, TValue>
てList<T>
同じ結果を得ることができます(わずかな違いがあります)。クラスにはデータベース内のProperties
列名が含まれているだけなので、変更する場所が1つあります(疑問に思った場合に備えて)。
DataTable-コメントに基づく更新
いつでも中間オブジェクトを挿入できます。この例では、DataTableとUIの間にビジネスレイヤーを挿入し、上記で何をするかについて説明しました。ただし、DataTableはビジネスオブジェクトではありません。これは、データベースを視覚的に表現したものです。これをUIレイヤーに転送して、デカップリングと呼ぶことはできません。彼らはあなたがDataTableを使わなければならないと言います、彼らはあなたがそのDataTableをUIに転送しなければならないと言いますか?私は彼らがそうすることを想像することはできません。そうした場合、分離されることはありません。DataTableとUIレイヤーの間に常に中間オブジェクトが必要です。