0

ASP.NET(2.0以降)UI/プレゼンテーション層を介してビジネス/ドメインオブジェクトを操作するために何が機能するか/機能しないかについての考えを集めようとしているだけです。特に、ASP.NETコードがビジネスレイヤーと直接通信する従来のASP.NETLOBアプリケーションの状況では。私はこのタイプの設計に頻繁に出くわし、理想的なソリューション(つまり、特定のパターンを実装する)と、「パターン」が実装されていない場合に完全な書き直しを必要としない最良の実用的なソリューションは何か疑問に思います。

これがサンプルシナリオです。

特定のビジネス/ドメインオブジェクトの「編集/新規」ページである単一のASP.NETページ。例として、「Person」を使用してみましょう。このページから名前と住所の情報を編集したいと思います。ユーザーが編集またはデータの入力を行っているときに、フォームが自分自身を更新するためにポストバックする必要がある場合があります。たとえば、住所を編集するときは、「国」を選択します。その後、州/地域のドロップダウンが有効になり、選択した国の関連情報で更新されます。これは本質的にビジネスロジック(依存するフィールドに基づいて使用可能な選択を制限する)であり、このロジックはビジネスレイヤーによって処理されます(これは単なる一例であることに注意してください。

理想的には、このロジックはビジネス/ドメインオブジェクトにのみ格納されます(つまり、ASP.NETコードでロジックが複製されていません)。これを実現するには、ビジネス/ドメインオブジェクトを再初期化し、各ポストバックの現在のUI値に基づいて状態を設定する必要があると思います。

例えば:

private Person person = null;

protected void Page_Load()
{
    person = PersonRepository.Load(Request.QueryString["id"]);

    if (Page.IsPostBack)
        SetPersonStateFromUI(person);
    else
        SetUIStateFromPerson(person);
}

protected void CountryDropDownList_OnChange()
{
    this.StateRegionDropDownList.Enabled = true;
    this.StateRegionDropDownList.Items.Clear();
    this.StateRegionDropDownList.DataSource = person.AvailableStateRegions;
    this.StateRegionDropDownList.DataBind();
}

私が見た他のオプションは、ページがバックアップされるたびにリポジトリ(別名データベース)からビジネスオブジェクトをロードするのではなく、SessionStateに保存することです。

考え?

4

3 に答える 3

0

あなたの例をBLではなく「UI拡張」バケットに入れます。エントリが正しいことを確認するのはBLですが、データ入力の容易化は私の意見ではUIです。

于 2009-04-22T15:37:55.140 に答える
0

非常に単純なことについては、通常のポストバックを気にせず、ajax アプローチを使用します。たとえば、都市のリストを取得する必要がある場合、指定された州から都市のリストを取得するページ メソッド (または Web サービス) を使用できます。

オプションがさまざまなパラメーターに依存している場合、あなたのやり方はうまくいくでしょう。セッションに物を保存することには利点があります。エンティティは同時に複数に表示されますか? その場合、ユーザー A とユーザー B の両方が同じものを編集するとどうなりますか。また、毎回ロードする場合、毎回データベースに精通していますか? 名前を編集してから国を選択するとどうなりますか?ブラウザがクラッシュします。DB の名前を更新しましたか?

于 2009-04-22T15:38:12.253 に答える
0

これは私が少し同意しない行です:

this.StateRegionDropDownList.DataSource = person.AvailableStateRegions;

Person はビジネス/ドメイン オブジェクトですが、決定を下すための情報が存在する場所であっても、州/地域のマッピング (たとえば) を処理する必要があるオブジェクトではありません。

決定を下すために複数の変数が必要な、より複雑な例では、一般に、最終的に到達しようとしているドメイン オブジェクトから開始し、必要なすべての値を与えることができるそのオブジェクトで関数を呼び出すことです。ビジネス上の意思決定を行うための情報。

おそらく(Stateクラスで静的関数を使用して):

this.StateRegionDropDownList.DataSource = State.GetAvailableStateRegions(person, ipAddress);

UI ヘルパーの問題を Person ドメイン オブジェクトから分離した結果、このスタイルのプログラミングは「よりテストしやすく」なる傾向があります。

于 2009-05-14T21:00:10.853 に答える