プレゼンテーション モデルをデータベースから直接ロードする
-
02-10-2019 - |
質問
私は、WinForms クライアントがデータベースを直接呼び出す 2 層アプリケーションに取り組んでいます。シナリオの 1 つでは、Customer エンティティのリストをユーザーに表示する必要があります。問題は、Customer エンティティには多くのプロパティ (いくつかは非常に重い) が含まれており、それらのうち必要なのは姓と名の 2 つだけであることです。したがって、パフォーマンスを向上させ、プレゼンテーションロジックをより明確にするために、必要なプロパティのみを備えたある種の CustomersummaryViewModel クラスを作成し、NHibernate のプロジェクション機能を使用してそれをロードしたいと考えています。ここで私が懸念しているのは、この場合、データ アクセス ロジックがプレゼンテーションと結びついてしまい、概念的に間違っているように私には見えることです。
これで大丈夫だと思いますか、それとももっと良い解決策があると思いますか?
解決
CustomersummaryViewModelをレポート(CustomersummaryReport)と考えて良いと思います。このようなシナリオについてエンティティをクエリし、レポートとして扱うことは問題ありません。ほとんどのレポートはより複雑で、複数のエンティティと集計クエリを使用します。このレポートは非常にシンプルですが、レポートのように使用できます。
パフォーマンスが重要であるとも述べています。これが、別個のレポート クエリと DTO を使用するもう 1 つの理由です。customer エンティティは、使用する「メイン」エンティティの 1 つのように思えます。初期化されていない遅延ロードされたプロパティをデータベースから取得するのにかなりの時間がかかるということは、顧客エンティティ自体を最適化する代わりに、レポート クエリを使用して顧客エンティティに関する情報を取得するよう警告する可能性があります。これが必要なケースを見たことがあるので、単なる警告です。
ちなみに、次のようなより簡単な構文として、プロジェクションの代わりに linq を検討することもできます。
var reports = session.Linq<Customer>()
.Where(condition)
.Select(customer => new Report
{
FirstName = customer.FirstName,
LastName = customer.LastName
})
.ToList();