1

OrderとOrderItemの2つのドメインクラスがあり、Orderが1つ以上の注文アイテムを含む集約ルートとして機能するとします。次のように:

    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がOrderと同じタイムスタンプ(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 OrderId [ get; private set; }。また、OrderStatusに列挙型を使用することをお勧めします。

于 2012-06-11T05:31:18.443 に答える