1

假设我有两个域类 Order 和 OrderItem,其中 Order 用作包含一个或多个订单项的聚合根。如下:

    class OrderItem
    {
        public long LineItemId { get; set; }
        public String ProductId { get; set; }
        public DateTime CreatedDate { get; set; }
    }

    class Order
    {
        public long OrderId { get; set; }
        public DateTime OrderDate { get; set; }
        public String OrderStatus { get; set; }
        public OrderItem[] OrderItems { get; set; }
        public DateTime CreatedDate { get; set; }
    }

现在,在初始化 Order 对象及其行项目时,是否可以在子项目初始化程序中引用或访问聚合的根属性/字段,如下所示:

        var order = new Order
        {
            OrderId = 1,
            OrderDate = new DateTime(2012, 6, 1),
            OrderStatus = "OPEN",
            CreatedDate = DateTime.Now,
            OrderItems = new[]
                                {
                                    new OrderItem {
                                        LineItemId = 1,
                                        ProductId = "Orange",
                                        CreatedDate = ??? // Initialize this to order's CreatedDate
                                    },
                                    new OrderItem {
                                        LineItemId = 2,
                                        ProductId = "Pear",
                                        CreatedDate = ??? // Initialize this to order's CreatedDate
                                    }
                                }
        };

这里的目标是确保 OrderItem 具有与订单相同的时间戳 (CreatedDate) - 到 T -。这可以很容易地实现 - 无需(当然)引入一个额外的变量来保存 CreatedDate?

4

2 回答 2

1

您不能在初始化程序中引用父变量,但我认为以下内容可以以类似的方式完成您尝试执行的操作:

var order = new Order
{
    OrderId = 1,
    OrderDate = new DateTime(2012, 6, 1),
    OrderStatus = "OPEN",
    CreatedDate = DateTime.Now
};
order.OrderItems = new[]{
    new OrderItem {
        LineItemId = 1,
        ProductId = "Orange",
        CreatedDate = order.CreatedDate
    },
    new OrderItem {
        LineItemId = 2,
        ProductId = "Pear",
        CreatedDate = order.CreatedDate
    }};
于 2012-06-11T05:40:15.873 回答
0

您不能引用正在初始化的对象。出于一个简单的原因,它可以让您轻松创建一个循环。

在您的情况下,您可以通过将订单的创建时间戳移到构造函数中并将 OrderItems 属性更改为

public OrderItem[] OrderItems
{
    get
    {
        return this.orderItems;
    }
    set
    {
        this.orderItems = value;
        foreach (var item in this.orderItems)
        {
            item.CreatedDate = this.OrderDate;
        }
    }           
}

并可能将 OrderDate 设为只读。如果你必须有一个无参数的构造函数,你也可以在 OrderDate 中实现 foreach 循环,并用一个私有字段支持它——这样一切都会同步。

为了完整起见,OrderDate 在不使用构造函数时:

public DateTime OrderDate
{
    get
    {
        return this.orderDate;
    }
    set
    {
        this.orderDate = value;
        foreach (var item in this.orderItems)
        {
            item.CreatedDate = this.OrderDate;
        }
    }
}

另外,我很确定我会将部分/大部分内容移到构造函数中 - 尤其是时间戳是它的主要候选对象,与 Id 相同,因为这样你可以将它们设置为只读的 public public OrderId [ get; private set; }。另外,我建议对 OrderStatus 使用枚举。

于 2012-06-11T05:31:18.443 回答