NHibernate中只读列表的最佳实践是什么?

Mik*_*liy 10 .net arrays nhibernate domain-driven-design list

我正在研究的域模型具有根聚合和子实体.类似下面的代码:

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

class OrderLine
{
}
Run Code Online (Sandbox Code Playgroud)

现在我希望我的订单控制线.像这样的东西:

class Order
{
   OrderLine[] Lines {get;}

   void AddLine(OrderLine line);
}
Run Code Online (Sandbox Code Playgroud)

目前我们使用以下模式:

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

   void AddLine(OrderLine line)
   {
      this.orders.Add(line);
   {
}
Run Code Online (Sandbox Code Playgroud)

NHibernate直接映射到lines字段.

现在问题......

  • 你在这种情况下练习什么?
  • 有没有人使用方法:public IEnumerable GetLines()
  • 您使用什么作为财产的返回类型?可能是ReadOnlyCollection或IEnumerable;
  • 可能这不是最好问的地方吗?建议请.

更新:似乎IEnumerable获胜,但解决方案仍然不完美......

Fre*_*els 14

我是这样做的:

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 )
      {
          ...
      }
}
Run Code Online (Sandbox Code Playgroud)

然后,在映射中,NHibernate被告知要使用_orderLines字段:

<set name="OrderLine" access="field.camelcase-underscore" ... >
...
</set>
Run Code Online (Sandbox Code Playgroud)


gco*_*res 9

我使用的模式是:

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

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

   void AddLine(OrderLine line)
   {
       this.orders.Add(line);
   }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是.NET 3.5,则可以使用LINQ获得IEnumerable所需的所有搜索功能,并隐藏您的集合实现.

返回OrderLine []的问题是您的集合可以在外部修改,例如:

Order.Lines[0] = new OrderLine().
Run Code Online (Sandbox Code Playgroud)

  • 是的,但你必须做铸造.这不仅仅是关于保护,而是关于展示你可以对收藏品做些什么.如果您想要额外的安全性,可以返回this.lines.AsReadonly(). (2认同)