43

私はソフトウェア開発に非常に慣れていません。階層化アーキテクチャは、オブジェクト指向ソフトウェア開発のプロセスで発生する複雑さを軽減し、言うまでもなく、コードを整理しておくための優れた方法だと思います。

私はドメイン駆動設計のアプローチについて学ぶことに興味があり、それに慣れるためにいくつかの問題に遭遇しました (もちろん、初心者レベルのものです)。
ここにあります -

個人に関連するデータをデータベースに保存し、個人の詳細を WPF に表示するアプリケーションを構築したいと考えていますDataGrid(DDD はこのような規模のアプリには適していませんが、私のようなアマチュアにとって物事を単純にするためです)。それで、ドメインクラス「Person」を作成しました。

    public class Person
    {
        public Person(dataType paramA)
        {
            this.PropertyA = paramA;
        }

        private dataType _fieldA;
        public dataType PropertyA
        {
            //encapsulates _fieldA    
        }

        public dataType PropertyX
        {        
            //some code that manipulates private field    
        }

        private dataType MethodPQR(dataType param)
        {        
            //some code    
        }
    }

さて、私のDDDの理解では、アーキテクチャ(最も単純なバージョン)は次のようになるはずです(間違っている場合は修正してください)-
ここに画像の説明を入力

ノート:

  1. DataGridをsome にバインドしてObservableCollection、あらゆる種類の変更を即座に反映さ せたいと考えています。

  2. これは WPF アプリケーションですが、必ずしも MVVM パターンである必要はなく、意図的にコード ビハインドを使用したいと考えています。

私の質問は -

  1. にはどのようなコードが属していApplication Layerますか?

  2. 私の推測では、ObservableColletionドメイン オブジェクト (つまりPerson) の を の としてItmsSourceバインドするべきではありませんDataGrid。次に、ドメイン オブジェクトからどのタイプのオブジェクトを抽出する必要がありますか?また、その方法は?

  3. との間のデカップリングを維持するにはPresentation LayerDomain Layerおそらく のような規則がありnever instantiate domain objects directly in the presentation layerます。その場合のnon-directアプローチは何ですか?

  4. コード ビハインドが と通信する場合は、 ?と通信するApplication Layer必要があります。しかし、データ アクセスに関連しないある種のドメイン アクセスが必要な場合はどうすればよいでしょうか(このアプリには含まれていない可能性がありますが、発生する可能性がありますよね? ) 。に話す?Application LayerData RepositoryXDomain LayerApplication Layer

私の質問は非常にアマチュアレベルのものであることは承知していますが、それらは確かに、私が直面している問題から明確な全体像を得るために提起された質問です. ですので、もしお時間のある方がいらっしゃれば、どんなご返事もお待ちしております。

編集:Data Repositoryの参照が必要かどうかわかりませんDomain Model

4

1 に答える 1

52

より「古典的な」DDD に関して言えば、通常、ドメイン オブジェクトはドメイン外では許可されません。ただし、ドメイン オブジェクトをプレゼンテーション層で使用しないという絶対的なルールはありません。たとえば、Naked Objects は、ドメイン オブジェクトが直接使用される考え方を表しています。私自身は、ドメイン オブジェクトが直接使用されないという哲学に主に固執しているため、それらが提案するすべてのプラクティスに精通しているわけではありません。個人的には、ドメイン オブジェクトに直接バインドすることはお勧めできないと思いますが、...誰もがこれを要件と見なしているわけではないことに注意してください。

ドメイン自体の外部にドメイン オブジェクトを許可しない場合は、通常、DTO またはデータ転送オブジェクトを使用します。これらは、プロパティのみを持つ単なるクラスであり、そのような DTO クラスにはドメインの動作がありません。多くの場合、DTO はドメイン モデルの構造を正確に反映していますが、そうである必要はありません。

ビジネス ロジックはドメイン モデルに実装されることになっているため、アプリケーション層にあるものの多くは、通常はクライアント アプリケーションとの間でデータをやり取りするために、さまざまなサービスの調整に関係しています。多くの人は、何らかの形式の SOA または少なくとも Web サービスを使用しています。これらはリポジトリを呼び出しますが、リポジトリ呼び出しから返されたドメイン オブジェクトを取得し、プロパティ値を DTO にコピーするアセンブラなどの他のコンポーネントも必要とします。DTO はシリアル化され、呼び出し元に返されます。多くの場合、呼び出し元はプレゼンターまたはコントローラーですが、MVC または MVP を使用していない場合、呼び出し元はプレゼンテーション層にいます。リバース トリップはより複雑です。UI は、更新を表す DTO または追加される新しいオブジェクトを表す DTO を返す場合があります。

ドメイン層の「非データアクセス」に関しては、代表的な例がいくつかあります。ほとんどの人は通常、ドメイン サービスと考えている "X" コンポーネントを参照します。ドメイン サービスは、ドメイン モデルに近く、実際のビジネス ロジックが存在するという点で、アプリケーション サービスとは異なります。

たとえば、アプリケーションに何らかの発注が含まれる場合、実際には、発注と注文のフルフィルメントという 2 つの問題があります。アプリケーション サービスは、UI への発注を策定するために必要なデータの転送を仲介し、ユーザーが発注したい注文を返します。しかし、それはデータ転送を仲介するだけであり、アプリケーション サービスが終了する場所です。次に、ビジネス ルールを適用し、実際にその注文を満たすために必要な追加のドメイン オブジェクトを構築するために、ドメイン サービスが必要になる場合があります。

一般に、これは多くのシナリオに適用できる便利な概念またはメタファーであることがわかります。アプリケーション サービスは、リクエストの送信のみに関して、ある種のリクエストを容易にします。一方、ドメイン サービスは、実際の要求の履行を容易にします。

私が遭遇した、またはすぐに想像できるデータ指向以外の「アクセス」の唯一のモードは、プロセス指向の機能です。これはすべてのアプリケーションで発生するわけではありませんが、特定の分野で一般的です。たとえば、私が働いているヘルスケアでは、臨床データと臨床プロセスの両方を管理する重要な要素を組み込んだアプリケーションが必要になる場合があります。私はこの問題を解決するために、そのプロセスの強調をドメイン モデルの一部にせず、代わりに別のツールを使用しています。

OOP 手法は、実際のプロセス自体にはあまり適していません。プロセスにデータを提供したり、プロセスからデータを取得したりするのに役立ちます。オブジェクト指向は、結局のところ、主に名詞指向でもあります。リアルタイムのプロセス管理には、「名詞指向のプログラミング」よりも「動詞指向のプログラミング」が必要です。ワークフロー ツールは「動詞指向」のツールであり、データ集約型とプロセス集約型の両方のアプリケーションのドメイン駆動モデルを補完することができます。私は C# DDD モデルと Workflow Foundation モデルの両方を含む多くの作業を行っていますが、これも特定の種類のアプリケーションにのみ必要です。典型的なビジネス アプリの多くは、ドメイン モデルとサービスのみを必要とします。

最後に、DDD の最も重要な側面は、技術やアーキテクチャではありません。その真の核心は、ユビキタス言語と、重要なドメイン知識を抽出するためのドメイン専門家との相互作用 (私の強い意見では、直接的な相互作用) を中心に展開しています。(私の意見では、DDD を行うと主張するほとんどの企業はそうではありません。なぜなら、非常に多くの企業がビジネスと開発が直接相互作用することを許可することを拒否しているからです。しかし、それは別のトピックです...) DDD を従来の OOP から実際に分離する手法であり、DDD の真の価値が生まれる場所です。

編集

リポジトリの使用に関する限り、図は正しいです。通常、アプリケーション層は常にドメイン オブジェクトのリポジトリを通過します。まず第一に、データをアプリケーションに持ち込める必要があり、ほとんどのアプリケーションにはある程度のクエリ機能も必要です。

ドメイン層の OTOH は通常、リポジトリとやり取りしません。通常、ドメイン モデルは自己完結型で、特定のテクノロジから分離する必要があります。つまり、「純粋なドメイン知識」を表す必要があります。永続性は本質的にある種の特定のテクノロジと密接に結び付いているため、一般的に、人々はドメイン モデルに永続性を実装しないように努めています。リポジトリがありますが、通常はドメイン モデルでリポジトリ メソッドを呼び出したくありません。

ドメイン モデル自体の内部では、オブジェクトは新しいオブジェクト (直接またはファクトリを介してインスタンス化される) として取得されるか、関連付けをトラバースすることによって到達されます。新しいオブジェクトを作成するときに、必要なすべてをコンストラクターに渡すことが実際的でない場合があるため、これは、ドメイン モデル自体内で何らかのデータ アクセスが必要になる場合の 1 つです。通常、人々が行うことは、インターフェースを介してデータ サービスを渡すことです。これにより、ドメイン モデルにデータ アクセスを提供できますが、データ層の実装からは切り離されたままになります。しかし、ほとんどの場合、ドメイン オブジェクトは、既にインスタンス化されている他のドメイン オブジェクトと連携して動作します。

于 2011-05-05T12:11:20.193 に答える