当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《NHibernate中只读列表的最佳实践是什么?》经验,为你挑选了2个好方法。

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

class Order
{
   IList Lines {get;set;}
}

class OrderLine
{
}

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

class Order
{
   OrderLine[] Lines {get;}

   void AddLine(OrderLine line);
}

目前我们使用以下模式:

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

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

NHibernate直接映射到lines字段.

现在问题......

你在这种情况下练习什么?

有没有人使用方法:public IEnumerable GetLines()

您使用什么作为财产的返回类型?可能是ReadOnlyCollection或IEnumerable;

可能这不是最好问的地方吗?建议请.

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



1> Frederik Ghe..:

我是这样做的:

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

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

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

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


...



2> gcores..:

我使用的模式是:

class Order
{
   private List lines = new List();

   IEnumerable Lines { get { return this.lines; } }

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

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

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

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


是的,但你必须做铸造.这不仅仅是关于保护,而是关于展示你可以对收藏品做些什么.如果您想要额外的安全性,可以返回this.lines.AsReadonly().
推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有