Dot-Net
NHibernate 中只讀列表的最佳實踐是什麼
我正在研究的域模型具有根聚合和子實體。類似於以下程式碼:
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>