2011-04-21 4 views
3

現在、私のエンティティではコレクションをIListとして公開していますが、ユーザーをコレクションに手動で追加できないようにIEnumerableとして公開することを考えています。私はこれらの操作の特定の追加をして、私の双方向関係が損なわれないようにすることができます。このシナリオでは、いくつか質問があります。HasManyとManyToManyの関係をIEnumerableとして公開する

  1. IEnumberableとして公開すると、エンティティ内の関係を表すすべてのコレクションに対して追加と削除のメソッドが必要になりますか?
  2. これを行う簡単な方法はありますか?私はちょうどこのことをやっているのではない。
  3. このようにしていますか?我々は唯一のIEnumerableを公開するように上記のクラスは、につながる変換

    public class OrderHeader 
    { 
        public virtual Guid OrderId { get; private set; } 
    
        public virtual IList<OrderLine> OrderLines { get; set; } 
    
        public virtual void AddLine(OrderLine orderLine) 
        { 
         orderLine.Order = this; 
         OrderLines.Add(orderLine); 
        } 
    
        //No need for a remove method since we expose collection as IList 
    } 
    

public class OrderHeader 
{ 
    public virtual Guid OrderId { get; private set; } 

    private IList<OrderLine> orderLines { get; set; } 
    public IEnumerable<OrderLine> OrderLines { get { return orderLines; } } 

    public virtual void AddLine(OrderLine orderLine) 
    { 
     orderLine.Order = this; 
     orderLines.Add(orderLine); 
    } 

    public virtual void RemoveLine(OrderLine orderLine) 
    { 
     orderLines.Remove(orderLine); 
    } 
} 

答えて

2
  1. あなたがIEnumerableをを公開する場合は、[はい、それがベストです追加/削除を処理するクラスにメソッドを追加する
  2. A pバックフィールドを騒がすことはかなり良い解決策です。
  3. はい、しかし、あなたが本当に公開コレクション使用ReadOnlyCollectionへのアクセスのみを読みたい場合は、心に留めておく - マイナーチェンジとダンの答え、との合意http://msdn.microsoft.com/en-us/library/ms132474.aspx
+0

をだからあなたはどうしたら次のようになります。public IEnumerable {get {return new readOnlyCollection (orderLines); }} –

2

public IEnumerable<OrderLine> OrderLines 
{ get { return orderLines.Select(x => x; } } 
+0

@Diegoなぜあなたはダンの答えを好むのですか –

+1

@ColeW:よりメモリ効率が良いので –

+0

@Diego、 '.Select(x => x);'が返されるのではなくyieldですか? –

関連する問題