0

WebFormsを使用して中規模のASP.NETWebアプリケーションを設計/構築しています。プロジェクトの主な作業は各Webフォームの作成であり、コントロールを(コード/データ/データフローの意味で)設計する方法がわかりません。

私が何を扱っているかについていくつか例を挙げて、私が何を意味するのかを理解できるようにします。


アプリケーションでの一般的なタスクは、番地の入力と表示です。そこで、一連のHtmlInputText要素(1行目は1行目、町/市、国、郵便番号など)を含む「AddressFields」というUserControlを作成しました。私のDBエンティティクラスには「Address」というクラスが含まれているため、このコントロールには次のメソッドがあります。

  • void ShowAddress(Address addr)-HtmlInputText要素に適切なテキストを入力します)。
  • void UpdateAddress(Address addr)-addrの内容をHtmlInputText要素の現在の内容で更新します
  • Address CreateAddress()-Addressの新しいインスタンスを作成し、それをUpdateAddressに渡して、それを返します。

ここまでは順調ですね。これが機能するのは、AddressFieldsコントロールが「ダム」であり、ユーザーにデータを表示して取得するだけだからです。ViewStateもHtmlInputTextフィールドによって直接管理されるため、追加のロジックは必要ありません。


私のアプリケーションのもう1つのエンティティは、Address属性を持つクラスである「Client」ですが、このクラスにはさらに複雑な側面がいくつかあります。たとえば、クライアントには、割り当てることができる一連のタグ(私のアプリケーションでは「カテゴリ」)があります。この場合、ASP.NETCheckboxListコントロールのサブクラスを設計しました。

クライアントの情報(AddressFieldsコントロールを含む)を表示するために必要なすべてのフィールドを含む「ClientFields」という別のUserControlを作成しましたが、「CategoryList」というCheckboxListサブクラスも含まれています。

ここでの問題は、CategoryListコントロールを表示するデータに提供する必要があることです(ただし、ビューステートを使用するため、ポストバックでは提供されません)。この場合、私の質問は次のとおりです。データベースに接続してカテゴリリストを取得するのは誰の責任ですか。

それはCategoryListコントロールですか?(もしそうなら、コントロールのライフスパンのどこでデータベースにクエリを実行しますか?それはClientFieldsが入力された後に発生するため、Control.Loadでは実行できません。ClientFields自体で発生しますか?(ここでも、ライフスパンのどこで発生しますか? ClientFieldsにはPage.Load内で呼び出されるShowClient(Client c)メソッドがあるため、これは発生します。別の方法は、ClientFieldsからCategoryListを公開して、Pageから直接アクセスできるようにすることですが、これは優れたソフトウェア設計の違反です。

4

1 に答える 1

1

私の意見では、CategoryListは、カテゴリリストデータを取得する責任があります。これは、特定のクライアントによって1つ以上が選択されているかどうかに関係なく、すべてのカテゴリデータを取得する必要があるためです。

CategoryListは、その存続期間中にいつデータベースにクエリを実行しますか?

通常、OnInitメソッドをオーバーライドしてCategoryListにデータを入力しますが、その時点ではViewStateが機能し始めないため、DBからデータを取得し、各ポストバックにデータを入力する必要があります。ViewStateに依存する場合は、オーバーライドされたOnInitメソッドでPageのInitCompleteイベントハンドラーを定義および登録し、イベントハンドラーにCategoryListを入力します。OnInitメソッドとInitCompleteイベントの両方が、Loadイベントの前に呼び出され/発生します。

//In CategoryList control
protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    Page.InitComplete += new EventHandler(Page_InitComplete);
}

void Page_InitComplete(object sender, EventArgs e)
{
    // retrieve the data and populate the control
}

それが役に立てば幸い

于 2011-03-28T06:10:19.013 に答える