0

私はまだdddに頭を悩ませているので、これが意味をなさない場合は許してください。私が持っているとしましょう

public class Customer{
    public IList<Order> Orders{get;set;}  // should be encapsulated i know
}

public class Order{
    private Customer _readOnlyCustomer;
    public virtual Customer ReadOnlyCustomer { get { return _readOnlyCustomer; } }
    // possibly
    public virtual void SetCustomer(Customer customer) {_readOnlyCustomer = customer}
}

最初に私はプライベートreadonlyCustomerビジネスを行っています。これは、ある集約ルートが別の集約ルートを変更してはならないことを理解しているためです。これを流暢なマッピングの問題に直接強制することはできませんが、少なくとも警告するような名前を付けることができます。変更できないこと。マッピングでフィールドを読み取り専用にすることもできますが、これは実際にこれを強制しますが、次の質問では問題になる可能性があり、顧客側でこれを強制する方法がわかりません。 customer.ordersコレクションを変更します。この問題についての考えは歓迎されます。しかし、私の本当の質問はです。

新しい注文を作成する場合。注文に顧客を設定して保存し、Customer.Ordersコレクションをnhibernateで更新するのは理にかなっていますか、または顧客をCustomer.Ordersコレクションに設定して注文を追加してから顧客を保存する必要があります。

私がこれを書いているとき、私がそれを行っていた方法は、子で親を参照せず、親のコレクションを更新することでした。これは、NHでdb呼び出しの利点があり、節約の処理が容易になると思いますが、トラバースが困難になります。オブジェクトをAgルートまたはエンティティとして見ているので、コレクションとインスタンスの間に双方向の関係を持つことがAgルートのトラバーサルと自律に役立つことがわかります。

どちらの使い方をするか、そして/または私が物事を正しく見ているかどうかを理解するのを手伝ってください。ありがとう、ライフ

4

1 に答える 1

0

// カプセル化する必要があります

カプセル化を強制すると非常に面倒になる可能性があるため、遠慮なく削除してください。
慣習に頼る - 何をどこで変更する必要があるかに注意してください。

public virtual Customer ReadOnlyCustomer

あなたのクライアントは、読み取り専用の顧客について話しているのですか? 私は賭けない。

新しい注文を作成する場合。注文に顧客を設定して保存し、nhibernate で Customer.Orders コレクションを更新するか、顧客が設定された注文を Customer.Orders コレクションに追加して、顧客を保存する必要がありますか。

顧客を注文に設定しません。顧客に注文を追加しません。

お客様が商品を注文。これは、コードでどのように見えるかを反映しています。

class customer
  method order(product)
    orders.Add(new Order(product))
于 2012-06-29T11:10:35.850 に答える