2011-07-28 19 views
-1

たとえば、集計オブジェクトがある場合Order-> OrderLineここでOrderオブジェクトは集約ルートとして識別されるため、OrderLineをOrderに追加するには、集計ルートを介してこれを行うことが期待されます。 Order.AddOrderLine(OrderLine行)。コレクションの操作C#

Orderオブジェクトは明らかにOrderLinesのコレクションを公開しますが、このコレクションを直接使用してOrderLinesを追加しないようにするにはどうすればよいですか?答えはReadonlyコレクションを使用することです。これにより、コンシューマーはオブジェクトの状態、つまりコレクション内のOrderLinesを変更しますか?

おかげ

+0

コードを投稿できますか? –

+3

Readonlyコレクションに入っていても、消費者は内部のオブジェクトを変更できなくなります。 –

+0

なぜ人々は直接注文を追加したくないのですか? –

答えて

5

はIEnumerableを<オーダーラインとしてご注文ラインを公開>し、必要に応じてメソッドを追加/削除実装します。そうすれば、クライアントはコレクションを反復するだけで、集計を通過することはできません。

+0

Spot on!どうもありがとう。 – David

0

readonlyキーワードを使用してコレクションにマークを付けると、コレクションの参照は再割り当てされませんが、コレクションの内容は変更できません。

List(T).AsReadOnlyメソッドを使用して、読んでいるもののように聞こえるReadOnlyCollectionインスタンスを返すことができます。

http://msdn.microsoft.com/en-us/library/e78dcd75.aspx

0

あなたは、例えば、あなたがあなたの注文にオーダーラインを渡す別の方法を考える必要がありますあなたのOrderLineオブジェクトを公開したくない場合以下の私の例のように、別のクラスにメタ情報だけを提出してください。

/// <summary> 
/// Represents an order, order lines are not accessible by other classes 
/// </summary> 
public class Order 
{ 
    private readonly List<OrderLine> _orderLines = new List<OrderLine>(); 

    public void AddOrderLineFromProperties(OrderLineProperties properties) 
    { 
     _orderLines.Add(properties.CreateOrderLine()); 
    } 
} 

/// <summary> 
/// Class which contains orderline information, before it is 
/// "turned into a real orderline" 
/// </summary> 
public class OrderLineProperties 
{ 
    public OrderLine CreateOrderLine() 
    { 
     return new OrderLine(); 
    } 
} 

/// <summary> 
/// the concrete order line 
/// </summary> 
public class OrderLine 
{ 

}