私は従来の DDD をあきらめていますが、これは多くの場合時間の無駄であり、無限のマッピングを行う必要があります: data layer <--> domain layer <--> presentation layer
.
小さな変更であっても、データ モデル、ドメイン モデル、プレゼンテーション モデル / ビューモデル、リポジトリ、マネージャー / サービス クラス、そしてもちろん AutoMapper マップを変更し、すべてをテストする必要があります。各呼び出しでは、基になるコードを呼び出すレイヤーを呼び出すレイヤーを呼び出す必要があります。そして、「将来必要になるかもしれない」以外の見返りはありません。うーん。
私の現在のアプローチはより実用的です。
- 「データ層」と「ドメイン層」の違いについてはもはや気にしません。意味がないからです。用語は交換可能です。EF に任せて、必要に応じてインターフェイスとリポジトリを追加します。
- 「データ」プロジェクトと「ドメイン」プロジェクトを (「コア」という退屈な名前に) マージしましたが、Visual Studio の実行速度が実際に速くなったと断言できます。
- EF エンティティがスタックを上下することを許可しますが、通常どおり、それらをプレゼンテーション モデル / ビューモデルにマッピングします。
- 単純な操作の場合はコントローラーから直接リポジトリを呼び出し、複雑な操作の場合は通常どおりドメイン マネージャー/サービスを使用します。リポジトリが IQueryable を公開することはありません。
- エンティティ/POCO を部分クラスとして定義しているため、対応する部分クラスにドメインの動作を個別に追加できます。
問題:あらゆる場所でエンティティを使用するようになったため、クライアント コードでエンティティのナビゲーション プロパティを確認できます。また、モデルはリポジトリを離れた後に常に具体化されるため、これらのナビゲーション プロパティは多くの場合 null です。
考えられる解決策:
1. それと一緒に暮らす。それは醜いですが、上で説明した問題よりはましです。
2. エンティティごとに、ナビゲーション プロパティを非表示にするインターフェイスを定義します。クライアント コードでインターフェイスを使用するようにします。しかし皮肉なことに、これは別のレイヤーを意味します (薄くて扱いやすいとはいえ)。
3. 他には?
私はこの種の高速で緩いプログラミング スタイルに慣れていないので、いくつかの明らかなトリックを見逃している可能性があります。他に考慮すべきことはありますか?すぐに遭遇する他の問題があると確信しています。
編集: この質問は DDD に関するものではありません。そして、多くの人が従来の DDD アプローチに苦労していることに注意してください -- Seemannは同じ結論に達したようです . Rahienは「抽象化アンチパターンのための役に立たない抽象化」について話し、 Evans 自身は、DDD が真に役立つのは 5% だけであると述べましたケース。このスレも参照. コメント/回答のいくつかは、私がどのように DDD を間違って実行しているか、またはシステムを微調整して正しく実行する方法について予想通りのものです。ただし、私は DDD について尋ねたり、DDD が適切な場合にそれを叩いたりしているわけではありません。むしろ、上記の考え方に沿って他の人が何をしているのかを知りたいのです。DDD がすべての設計上の問題に対する万能薬であるとは限りません。10 年ごとに新しいプロセスが登場します (RUP の誰か? XP、アジャイル、Booch など...)。DDD は、最も輝かしい新しいものであり、最もよく知られ、使用されています。しかし、時間通りに出荷され、保守が容易な販売可能な製品を構築しようとしているため、実用主義が最初に来る必要があります。私が学んだ最も有用なプログラミング公理は、YAGNI です。私が望むのは、システムを一種の「DDD-lite」に変更することです。これにより、強力なデザイン/OOP/パターンの哲学が得られますが、脂肪はありません。