ビジネスレイヤー(またはサービスレイヤー、ドメインモデルなど)からバインディングリストを返す必要がありますか?

StackOverflow https://stackoverflow.com/questions/4683593

質問

UIにバインディングリストが必要で、コレクションとDatagridViewの間に双方向のデータビンディングを提供する必要があります。ただし、ビジネスレイヤー(またはドメインレイヤー、サービスレイヤー、データレイヤーなど)からバインディングリストを返すことは正しくないようです。つまり、UIの要件のためにバインディングリストのみを使用しているだけで、このUIの必要性はドメインレイヤーと結合されます。

これを行うための「適切な」分離された方法は何ですか? Ilistを返してから、プレゼンテーションのためにバインディングリストにコピーする必要がありますか?現実の世界の観点から、このオーバーヘッドは何の価値もありますか?

役に立ちましたか?

解決

ドメインレイヤーは、より一般的なタイプと通知があるかどうかを返すと思います(ObservableCollection<>) か否か (IEnumerable<> また IList<>)要件に応えています。

UIレイヤーは、その機能が必要な場合は、それらを希望どおりに希望どおりにibindingListに移すことを扱うことができます。

使用しました Bindablelinq UIレイヤーでのバインディングリスト(おそらくフィルター付き)を通知/同期する目標を達成するために大成功を収めます。

他のヒント

Ilistのコピーはありません(少なくとも、コピー/クローンを作成したくないことを願っています)。あなたが通常することは、同じIlistオブジェクトに別の参照を作成することだけです。したがって、Ilistオブジェクトを返すことは悪いことではありません。

リストオブジェクトを返して、バインディングリスト(UIにある)から参照できます。

私の意見では、別のUI(コンソール、Web、Win、サービス)で前者を使用できるため、バインディングリストよりもIlist(リスト、ハッシュテーブルASO)オブジェクトを返す方が良いです。たとえば、バインディングリストの使用は、Webアプリケーションでは利点もありません。

「適切な」方法が何であるかはわかりませんが、過去にCSLAのようなフレームワークを使用しており、バインディングリストと現在、ビジネスリストの観測値を使用していることを知っています。これにより、UIのビジネスオブジェクトを使用して、UIがリストから追加または削除されたときにUIが更新されるため、非常にシンプルになります。 Ilistを返してから、それをバインディングリストにコピーする場合は、Ilistの変更を手動で監視して処理し、それらをバインディングリストに翻訳する必要があります。私の個人的な好みは、可能な限り、バインディングリストまたは観測値を使用してビジネス層をUIに提示する機能のリッチなビジネスレイヤーを持つことです。

独自のイベントハンドラーを実装せずにUI要素にビジネスモデルを編集したい場合は、ビジネスモデルにバインディングリストが必要です。

あなたがようなことをするときはいつでも new BindingList<MyWidget>( list ) ルートリストからバインディングを切り離しています。アイテムが編集されている場合、すべて正常に機能しますが、追加と削除は元のリストには反映されません。

私は最近、バインディングリストをタップすることで、このようなものを実装しようとしました ListChanged バインディングリストの変更を反映するようにモデルを更新したイベントですが、モデルがコントローラーによって変更された場合、UIのバインディングリストは更新されませんでした。

リストからアイテムを追加または削除するたびにイベントを提起する特別なアクセサをリストに作成できますが、これは、より多くのオーバーヘッドでバインディングリストホイールを再発明するだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top