私のプロジェクトが積層されている: -Entity(Persistent)オブジェクトをDTOオブジェクトに変換する必要がありますか?次のように
DAL (Entity)
- >BLL (DTO)
- >ApplicationComponent (ViewModel)
。
BLL
にアクセスするアプリケーションの複数のコンポーネント(ApplicationComponent
)があります。コンポーネントには、Windowsサービス、Webサービス、Web API、およびMVCコントローラが含まれます。 BLL
にDAL
からそれらを通過する間
私はDTO
オブジェクトへNHibernate
Entity
オブジェクトを変換しています。この状態をApplicationComponent
に渡している間に、BLL
は再びViewModel
に変換します。
これは、各レイヤーでの懸念事項とデータの処理方法を区別するのに役立ちます。私は、次の理由で表示するNHibernate
Entity
オブジェクトを返すの賛成ではないです: -
-
データは、私がなどのパスワード、ユーザタイプ、許可のように非表示(または必要な場合にのみ公開)したい
- 参照/結合に関しては、
NHibernate
は、プロパティがアクセスされたときに追加のクエリを実行し、遅延読み込みの使用を無効にします。 - (
Entity
の)ユーザーに公開されている不要なデータは、混乱とバグの原因となります。 - 持続性の実装が
BLL
/UI
に漏れています。Entity
はUI
用に設計されていません。どんな場合でもUI
には対応できません。 Entity
で奇数に見えるユーザー入力の検証には、DTO
の属性を使用します。
UI
にさらされます
私はこのアプローチには、次のような問題に直面しています: -
- 最大と明白な問題は、同じ機能を持つ冗長オブジェクトです。
- オブジェクトを変換するために、各レイヤーにマッパーメソッドを記述する必要があります。これは、
AutoMapper
または類似のものを使用することによって最小化することができます。問題を完全に解決するわけではありません。
質問: -
- が分離に対するこのANですと(少なくとも最小限に抑える)避けるべき?
- このアプローチが正しい場合、上記の2つの問題を完全に回避する簡単な方法はありません。提案してください。
- この方法が間違っている場合は、修正を提案してください。
参考資料: -
Link1た私の理解ではない良いアイデアを表示する
Entity
オブジェクトを転送することを示唆しています。Link2は、私がすでに合意している
DTO
とEntity
をマップするよう提案しています。Link3は役に立ちません。
Link4は、自動マッパーツールのようなものを使用していることを示しています。しかし、それでも問題は完全に解決されません。
Link5は素晴らしい投稿です。それはなぜそれらが私が合意している別々であるべきかを説明します。それはそれによって引き起こされるオーバーヘッドを最小限に抑える方法についてコメントしていません。
Link6はもう一度は役に立ちません。
編集1:
私はちょうど可能場合UI
であるようEntity
を使用することをお勧めしthis優秀答えをお読みください。私のプロジェクトのほとんどにはまだ適用されません。
編集2:
もう一つの優れたpostは私が今やっているようマッピング上の2つの道を行くことをお勧めします。オーバーヘッドを最小限に抑える方法はまだありません。
...だから、(チーム)は、何百ものオブジェクトをマップするために多くの時間を費やしました。ドメインを作成することができます。それは働いているようです...サーバからUIとバックに移動することが残っています...そして多くの人々がお互いを保証します - 再びDTOへのRE-MAPPINGは私には分かりません。オートマトンでさえ、コレクション/参考文献は挑戦になるでしょう。 while:Newtonsoft.Json(リゾルバ、エンティティおよび配列値プロバイダ)のオーバーライドはほとんどありません... JSONのシリアル化/デシリアライゼーションはすべてを解決しています。 DTOなし、新しいオブジェクトなし... JSON-ificationを管理しました... –