4

私はWebフォーム、C#、Asp.netを使用しています。ご存知のとおり、このモデルではUIとビジネスロジックが混在していることがよくあります。これらを効果的に分離するにはどうすればよいですか。

使用したい例は次のとおりです。GridViewとDataTableがあります(GridViewはDataTableにバインドされ、DataTableはストアドプロシージャから供給されます)。

GridView(UI)とDataTable(ビジネスロジック)を分離したいと思います。

DataTableのラッパーを作成する価値はありますか?従うことをお勧めできる、証明およびテストされた実用的なパターンはありますか?

経験のある人が光を当てることができれば、それは素晴らしいことです。そして最後に、ASP MVCは現在のところオプションではないので、お勧めしません。

私のデータベースアクセス層はDataTableを返します。これは会社のポリシーであるため、このデータベースレイヤーを使用する必要があることに注意してください。

4

3 に答える 3

2

私は最近、UIレイヤーからほとんど同じことを切り離しながら、これを経験しました。

ここここで私の進捗状況を見ることができます。

私の意見では、Aはビジネスロジックを表しDataTableていません。具体的には、データベースから直接取得したデータです。ビジネスロジックは、そのデータを真に有用なビジネスオブジェクトに変換します。

したがって、最初のステップは、DataTableをBusinessオブジェクトから切り離すことです。

List<object>これを行うには、DataTablesとDataTablesのコレクションを構成するオブジェクトを作成してから、それらのオブジェクトを表示するListViewを作成します。後の手順については、上記のリンクで説明しています。そして、前の手順は次のように簡単です。

  1. オブジェクトを表すクラスを作成します。
  2. DataTable(またはDataSet、またはデータを取得する方法)を反復処理し、それらのフィールドをそのオブジェクト(またはそのList<T>)のプロパティに押し込みます。
  3. そのリストを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レイヤーの間に常に中間オブジェクトが必要です。

于 2009-03-26T18:25:01.583 に答える
0

まず、データテーブルをゴミ箱に切り離します。ドメイン層を構築してから、DBを処理するある種のデータアクセス層を構築します(ORMを推奨)。

次に、UIにデータを提供するサービスレイヤーを構築します。すべてのビジネスロジックは、サービスまたはエンティティ自体の中にある必要があります。

于 2009-03-26T18:26:13.077 に答える
0

MVP (モデル ビュー プレゼンター) パターンの実装を検討してください。プレゼンター インターフェイスを介してビジネス ロジックを分離できるため、単体テスト機能も向上します。aspx ページの分離コードは、イベントのコネクタとプロパティのゲッター/セッターにすぎません。MS pattern&practices エンタープライズ アプリケーション ブロック (CAB - 複合アプリケーション ブロック - 私が間違っていなければ) で見つけることができます。
ここで詳細を読むことができます: http://msdn.microsoft.com/en-us/magazine/cc188690.aspx
ただし、DataTable/DataSets からオブジェクト (POCO) への移行も推奨されます。

于 2009-03-26T18:26:45.573 に答える