質問

これは実際のドメイン駆動型のデザインの質問:

概念的には、と思いく総根まで行く定義します。

私は従業員の主体は、表面の集合体としています。事業の 一部の 従業員が仕事と関連する違反のログインし、それに対する:

従業員-----*違反

となっているわけではないため、すべての従業員の対象と思ってくださいというふうに思って違反がないので、従業員の集合体を正しいのですか。

そこで仕事をしたいと思い従業員に関連する違反は、この二つの別々のリポジトリの相互作用による一部サービスですか?

最後に、追加または違う方法を従業員Entity?のは助かります!

役に立ちましたか?

解決

さらに多くの調査を行った後、自分の質問に対する答えが得られたと思います。

Paul Stovellは、 DDDメッセージボードで、同様の質問に対するこのわずかに編集された回答を。 <!> quot; Customer <!> quot; <!> quot; Employee <!> quot;および<!> quot; Order <!> quot; for <!> quot;違反<!> quot;アイデアが得られます。

  

顧客が注文を参照するため   順序が落ちることを必ずしも意味しない   顧客の集約ルート内。   顧客の住所はそうかもしれませんが、   注文は独立させることができます(   たとえば、次のようなサービスがあるとします   誰でも新しい注文をすべて処理します   顧客は。行かなければならない   Customer-<!> gt; Ordersは意味をなさない   このシナリオ)。

     

ドメインの観点から、次のことができます   それらの妥当性さえ疑問に思う   参照(顧客はへの参照を持っています   注文のリスト)。どれくらいの頻度で   実際にはすべての注文が必要です   顧客?一部のシステムでは、   しかし、他の人では、1人の顧客   多くの注文をする可能性があります。可能性は   間の顧客の注文が欲しい   日付範囲、または顧客の注文   まだ処理されていない、または注文   支払われていないなど。   すべてが必要になるシナリオ   それらのうち、比較的まれなものがあります。   しかし、それははるかに可能性が高いです   注文を処理するとき、あなたは   顧客情報が必要です。だから   コード、Order.Customer.Nameは便利です、   しかしCustomer.Orders[0].LineItem.SKU-   おそらくそれほど有用ではありません。もちろん、   それは完全にあなたのビジネスに依存します   ドメイン。

つまり、顧客の更新は注文の更新とは関係ありません。注文または私の場合の違反は、顧客/従業員とは無関係に処理される可能性があります。

違反に詳細線がある場合、違反線を変更すると違反に影響する可能性が高いため、違反と違反線は同じ集計の一部になります。

編集** 私のドメインのここでのしわは、違反には動作がないということです。基本的には、発生したイベントの記録です。その影響についてはまだわかりません。

他のヒント

Eric Evanの著書ドメイン駆動設計:ソフトウェアの中心にある複雑さへの取り組み

  

AGGREGATEは、データを変更するために 1つの単位として扱う関連オブジェクトのクラスターです。

ここには2つの重要なポイントがあります:

  1. これらのオブジェクトは、<!> quot; unit <!> quot;として扱う必要があります。
  2. <!> quot; data change <!> quot;の目的のため。

あなたのシナリオでは、EmployeeとViolationは必ずしもユニットであるとは限りませんが、OrderとOrderItemの例では、それらは単一のユニットの一部です。

集合体の境界をモデル化するときに重要なもう1つのことは、集合体に不変式があるかどうかです。不変式は、<!> quot; whole <!> quot;内で有効なビジネスルールです。集計。たとえば、OrderとOrderItemの例については、注文の合計費用が事前定義された金額よりも少ないことを示す不変式がある場合があります。この場合、OrderItemをOrderに追加するときはいつでも、この不変条件を適用して、Orderが有効であることを確認する必要があります。しかし、あなたの問題では、あなたのエンティティの間には不変なものはありません:従業員と違反。

短い答え:

従業員と違反はそれぞれ2つの別個の集合体に属していると思います。これらの各エンティティは、独自の集約ルートでもあります。したがって、EmployeeRepositoryとViolationRepositoryの2つのリポジトリが必要です。

また、違反から従業員への一方向の関連付けが必要だと思います。このようにして、各違反オブジェクトはそれが誰に属しているかを知っています。ただし、特定の従業員のすべての違反のリストを取得する場合は、ViolationRepositoryに問い合わせることができます。

var list = repository.FindAllViolationsByEmployee(someEmployee);

と言っているがて従業員のエンティティは、違反の各違反のない行動そのものです。だからこそできる読み上となっているように思いが現実のものとなる可能性がある二つの総根:

  • 従業員
  • EmployeeViolations(ここではEmployeeViolationCardはEmployeeViolationRecords)

EmployeeViolationsの別の同じ従業員のIDでコレクションが保存違反操作が行われた場合にはオブジェクト。きの挙動を従業員の人権侵害を分離このように得られないときには、いくつかの違法な行為です。

るかどうかの違反が企業価値オブジェクトすべき決定に基づく有効にする:easを有効にします。

私は同意モッシュありがとうございます。しかし、この概念との取引事業。私は実際に"目的でデータの変更"を"目的の取引(s)".

リポジトリのドメインモデルです。ドメイン環境の中で、"景色"かなり支持し又は業務機能や能力-a取引はない。は社員が一つ以上の違反、その場合、人々の生活に及ぼした影響につ、取引のポイントです。検討のご利用例です。

シナリオ:"従業員を犯する行為に違反しています。" このビジネスイベント(取引又はそのほんの一部にも分散トランザクション)が発生しました。根の影響を受けドメインのオブジェクトを実際に見られる以上からないかと考えられるのはなぜですね。ものを、覚えては行動と関係する取引ているビジネスプロセスのモデルは現実世界の精度が低くなっています。の関係のように、リレーショナルデータベース概念のドメインモデルを実際に示すこと(すなわちのassociativity)が読み込むことができますのいずれかの方向:

従業員 <----犯a-------犯---->違反

その利用の場合、このフェアすると言うことで取引を扱い、侵害のルートを"小"におけるエンティティが侵害となります。が、そうする総根うための参考と特定の事業活動または設定できます。がないと言うことで、異なる活動やプロセスできない場合もありますので、従業員の総根など、"新入社員行います。場合は介護がないと認められることによる負の影響の繰返しが参照できるトラバースドメインモデルを複数の方法。私に警告を表示して準拠すべきと考え、取り扱うコントローラの作品の事業ドメインなど、相当します。

別:の観点から物事を考えるパターン(MVC)、リポジトリはこのポウサダはサルバドールのドメイン対象のモデルは、このように一つでも雇用のコントローラーパターンです。通常、コントローラを宣言し、コンクリートの実施およびアクセスリポジトリ(ションの総根).

のデータにアクセスの世界---

使用LINQ To SQL例として、DataContextのコントローラの露光景との顧客、受注。の非コの枠組み志向のテーブルタイプ(粗相当にすごした。この参照を保持にその親コントローラ、ならびにコントローラの制御方法の場合、ビューが実現します。したがって、コントローラは、プロバイダのマッピング、翻訳、オブジェクトの水和など。このモデルは、そのデータPOCOs.ほとんどの代表的なMVCパターンです。

N/Hibernate例として、ISessionのコントローラの露光景との顧客、受注主体のセッション。Enumerable(stringクエリ)又はセッション。Get(object id)またはセッション。CreateCriteria(typeof(お客様)).List()

のビジネスロジックの世---

Customer { /*...*/ }

Employee { /*...*/ }

Repository<T> : IRepository<T>
              , IEnumerable<T>
              //, IQueryable<T>, IQueryProvider //optional

{ /**/ }

BusinessController {
 Repository<Customer>  Customers { get{ /*...*/ }} //aggregate root
 Repository<Order> Orders { get{ /*...*/ }} // aggregate root
}

このようにしましょうビジネスプロセスならびに取引のガイドをしたビジネスインフラは当然として進化プロセス/活動の実施または整理.また、好composability従来のブラックボックスデザイン。まだサービス指向やクラウドコンピューティング、まっすかった。:)

結論はどうなるのだろうか?

「違反」はルートエンティティになります。そして、「違反」は「従業員」のルートエンティティによって参照されます。すなわち、違反リポジトリ<!> lt;-<!> gt;従業員リポジトリ

ただし、動作しないため、違反をルートエンティティにすることに混乱しています。

しかし、「行動」はルートエンティティとしての資格基準ですか?そうは思いません。

ここで理解をテストするためのわずかに直交する質問です。Order... OrderItemの例に戻ると、システムにOrderItemsを直接調べる、つまり特定の製品のすべてのorderItemsまたはすべての注文を取得する分析モジュールがある場合があります与えられた値などよりも大きいアイテムは、そのような多くのユースケースを持ち、<!> quot;集約ルート<!> quotを駆動します。極端な場合、OrderItemはそれ自体が異なる集約ルートであると主張できますか?

状況によります。違反の変更/追加/削除は従業員の一部を変更しますか?従業員に対する違反件数、または過去3年以内の違反件数を保存していますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top