あなたは、DataTableのかDTOまたはドメインクラスを報告/検索のためにどちらが好きですか?
-
23-08-2019 - |
質問
現在、私が働いているプロジェクトはsearhing /フィルタリングページの多くを必要とします。たとえば、私は、データ、カテゴリ、ユニットによって問題を取得するためにcomlex検索ページを持っている...
問題ドメインクラスが複雑で、値オブジェクトと子オブジェクトの多くが含まれています。
.Iは、人々がUIを検索/フィルタリング/レポーティングの対処方法を疑問に思って。私の知る限りでは、私は3つのオプションを持っていますが、それらのどれも私を幸せにしない。
1。)ASP.NETのGridView
にUI Controls.For例にDataTableにし、バインドのDataTableを取得するために/ DAOをリポジトリにパラメータを送りますDataTable dataTable =issueReportRepository.FindBy(specs);
.....
grid.DataSource=dataTable;
grid.DataBind();
このオプションでは、私は単にによって与えられた仕様のためのドメイン・レイヤーとクエリのデータベースを渡すことができます。そして、私は完全に構築、複雑なドメインオブジェクトを取得するために持っていけません。 ...直接UIで、データベースとのショーからのDataTableにUIに表示するデータを取得します。値オブジェクト、子オブジェクト、の必要はありません。
しかし、私は完全にドメインオブジェクトを持っていないので、私は、データベースにこれをしなければならないメソッドの戻り値のようなUIで計算フィールドを表示する必要が持っている場合。ノーインテリセンスのようなロジックとDataTableの問題を複製する必要がある等...
2)UIコントロールにDTOとバインドDTOを取得するには/ DAOをリポジトリにパラメータを送信します。
IList<IssueDTO> issueDTOs =issueReportRepository.FindBy(specs);
....
grid.DataSource=issueDTOs;
grid.DataBind();
このオプションでは上記のように同じですが、私はすべての検索ページの貧血DTOオブジェクトを作成する必要があります。また、別の問題の検索ページのために私は問題のさまざまな部分を表示する必要がObjects.IssueSearchDTO、CompanyIssueTO、MyIssueDTO ....
3。)完全に構築ドメインオブジェクトを取得するために、実リポジトリクラスにパラメータを送信します。
IList<Issue> issues =issueRepository.FindBy(specs);
//Bind to grid...
私は、ドメイン駆動設計とパターンが好きです。 UI.Alsoに示されていないだろう、私はたくさんの子と値オブジェクトのを作成する必要があり、このオプションでは、このoption.butにはDTOや重複ロジックはありません、それは多くのOBが針の子供のための完全なドメインオブジェクトとパフォーマンスコストを得るために参加する必要がありオブジェクトと値オブジェクトます。
私はたぶん私は、このバージョンのために手で遅延ロードを実装することができます任意のORMツールを使用していないが、それは少し行き過ぎだ。
どちらをあなたは好きですか?それとも私はそれが間違っているのだろうか?任意の提案や、これを行うには良い方法はありますか?
解決
私はいくつかの提案を持っていますが、当然のことながら、全体的な答えは「それが依存」です。
まず、あなたはORMツールを使用する必要があります。また、そうすべきでない非常に良い理由を持っている必要があります。
あなたはORMツールを使用するつもりはない場合には、あなたは、単にような何かを言うあなたのオブジェクトのプロパティを作成することができるように第二に、手で遅延ロードを実装する比較的簡単です。
private Foo _foo;
public Foo Foo
{
get {
if(_foo == null)
{
_foo = _repository.Get(id);
}
return _foo;
}
}
第三には、パフォーマンスが最初に考慮されるべきでありながらエレガントなデザインから離れてあなたを駆動しないべきものです。私は、あなたが最初に(3)を使用し、その性能が不十分である場合にのみ、それから外れる必要があることを主張するだろう。これは、コードの最低額を書いて、あなたのデザインに少なくとも重複を持つになります。
パフォーマンスが低下した場合、あなたは遅延ロードを使用してキャッシュを使用してUI層中および/またはあなたのドメイン層に簡単に対処することができます。これらの両方が許容できるパフォーマンスを提供することができない場合は、あなただけの必要な値オブジェクトの軽量コレクションをバック渡すDTOのアプローチにフォールバックすることができます。
他のヒント
これはの偉大なの問題であり、私は同様に私の答えを提供したかったです。私はの技術的に最高のの答えはオプション#3に行くことだと思います。それは最高の要求を検索/レポート作成に将来の拡張のための拡張性と一緒にデータを記述して整理する機能を提供します。
がの、これは全体的に最良の選択肢かもしれませんが、IMOサポートするために必要なすべてのクラスとの関係のための追加の設計時間です他の(2)オプション対莫大なコストがあります(再使用されて何のORMツールが存在しないという前提の下で)の必要性を報告します。
私も私のアプリケーションの多くではこれで苦労し、現実には、#2は、時間と設計の間で最良の妥協であるということです。あなたはbusniessオブジェクトとすべてのニーズについて尋ねられた場合は今、完全にレイアウトされ、適切に設計されたモデルが重要であり、何の代替品がないことをいいえ質問はありません。しかし、それは報告して私にこれを検索に来るとき異なる動物です。 #2を強く貧血クラスでデータを入力し、#1のようなデータセット内のハードコード値ほど原始的ではなく、依然として大幅#3と比較して設計を完了するのに必要な時間の量を削減提供する。
理想的には私はすべてのレポートニーズを包含するように私のオブジェクト・モデルを拡張するのが大好きだが、時にはこれを実行するのに必要な作業は、単にニーズを報告するためのクラスの別のセットを作成することは簡単に、まだ現実的な選択肢であることを、とても広範囲です。私は実際には数年前にはほとんどこれと同じ質問をしても、ニーズを報告するためのクラスの別のセット(本質的のDTO)を作成することは悪い選択肢ではありませんでしたと言われた。
だから、それをラップするために、#3は、技術的に最良の選択肢であるが、複雑なレポート作成および検索ニーズのために一緒に時間と品質を考慮した場合#2は、おそらく最も現実的かつ実行可能な選択肢である。