如何添加到惰性列表

How to add to a lazy list

延迟加载入门。我有一个包含订单详情的订单。

public class Order
{
    public Guid OrderId { get; set; } = Guid.NewGuid();

    private Lazy<List<OrderDetail>> _OrderDetails => new Lazy<List<OrderDetail>>(() => OrderService.GetOrderDetails(this.OrderId));
    public List<OrderDetail> OrderDetails => _OrderDetails.Value;
}

这似乎可以很好地检索订单,但我无法创建订单。在保留新订单之前,我想添加订单详细信息,但是(为简洁起见跳过创建订单详细信息)当涉及到

Order.OrderDetails.Add(orderDetail);

没有向订单添加订单详细信息(没有抛出异常)。我认为这是因为懒惰。如何将成员添加到 OrderDetails 列表?

问题在于 _OrderDetails 中 => 的使用。这是发生了什么:

如果您调用 Order.OrderDetails.Add(orderDetail),这将访问 OrderDetails 属性,后者又会访问 _OrderDetails 属性,后者将执行 new Lazy<List<OrderDetail>>.这将最终创建列表,您向列表中添加一个新元素。

到目前为止还不错。

但是,如果您随后再次检查 Order.OrderDetails,这将再次访问 OrderDetails 属性,后者又会访问 _OrderDetails 属性,后者将再做一个 new Lazy<List<OrderDetail>>。所以你得到一个新的列表(没有你刚刚添加的元素)。

解决方法很简单:更换

private Lazy<List<OrderDetail>> _OrderDetails => 
    new Lazy<List<OrderDetail>>(() => 
        OrderService.GetOrderDetails(this.OrderId));

来自

private Lazy<List<OrderDetail>> _OrderDetails;

并在构造函数中初始化

public Order()
{
    _OrderDetails = new Lazy<List<OrderDetail>>(() => 
        OrderService.GetOrderDetails(this.OrderId));
}

这将在第一次访问时仅创建一次列表。

OrderId真的必须是可写的吗?如果是,您必须在 OrderId 更改时重新创建 _OrderDetails

private Guid _orderId = Guid.NewGuid();
public Guid OrderId 
{
    get { return _orderId; }
    set 
    {
        _orderId = value;
        // re-create _OrderDetails with the new value of OrderId
        _OrderDetails = new Lazy<List<OrderDetail>>(() => 
            OrderService.GetOrderDetails(this.OrderId));
    }
}