Dot-Net

NHibernate 中只讀列表的最佳實踐是什麼

  • August 25, 2013

我正在研究的域模型具有根聚合和子實體。類似於以下程式碼:

class Order
{
  IList<OrderLine> Lines {get;set;}
}

class OrderLine
{
}

現在我希望我的訂單控制線路。像這樣的東西:

class Order
{
  OrderLine[] Lines {get;}

  void AddLine(OrderLine line);
}

此時我們使用以下模式:

class Order
{
  private IList<OrderLine> lines = new List<OrderLine>();
  OrderLine[] Lines {get {return this.lines;}}

  void AddLine(OrderLine line)
  {
     this.orders.Add(line);
  {
}

NHibernate 直接映射到行欄位。

現在問題…

  • 在這種情況下你會練習什麼?
  • 有沒有人使用方法:public IEnumerable GetLines()
  • 您使用什麼作為屬性的返回類型?可能是 ReadOnlyCollection 或 IEnumerable;
  • 可能這不是最好的提問地方嗎?請建議。

更新:似乎 IEnumerable 獲勝,但解決方案仍然不完美……

我使用的模式是:

class Order
{
  private List<OrderLine> lines = new List<OrderLine>();

  IEnumerable<OrderLine> Lines { get { return this.lines; } }

  void AddLine(OrderLine line)
  {
      this.orders.Add(line);
  }
}

如果您使用的是 NET 3.5,您將獲得使用 LINQ 的 IEnumerable 所需的所有搜尋功能,並且隱藏您的集合實現。

返回 OrderLine 的問題

$$ $$是您的收藏可以在外部進行修改,例如:

Order.Lines[0] = new OrderLine().

我這樣做:

public class Order
{
     private ISet<OrderLine> _orderLines = new HashedSet<OrderLine>();

     public ReadOnlyCollection<OrderLine> OrderLines
     {
         get { return new List<OrderLine>(_orderLines).AsReadOnly(); }
     }

     public void AddOrderLine( OrderLine ol )
     {
         ...
     }
}

然後,當然,在映射中,NHibernate 被告知使用 _orderLines 欄位:

<set name="OrderLine" access="field.camelcase-underscore" ... >
...
</set>

引用自:https://stackoverflow.com/questions/645918