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から直接アクセスできるようにすることですが、これは優れたソフトウェア設計の違反です。