2

注文履歴のドメイン抽象クラスと、支払い、キャンセル、再アクティブ化などのイベントを考慮した具体的なクラスを考えてみましょう(次のコードは非常に簡略化されたバージョンです)

public abstract class OrderEvent
{
    protected OrderEvent(DateTime eventDate)
    {
        EventDate = eventDate;
    }

    public abstract string Description { get; }
    public DateTime EventDate { get; protected set; }
}

public class CancellationEvent : OrderEvent
{
    public CancellationEvent(DateTime cancelDate)
        : base(cancelDate)
    {

    }
    public override string Description { get { return "Cancellation"; } }
}

public class PaymentEvent : OrderEvent 
{
    public PaymentEvent(DateTime eventDate, decimal amount, PaymentOption paymentOption) : base(eventDate)
    {
        Description = description;
        Amount = amount;
        PaymentOption = paymentOption;
    }

    public override string Description { get{ return "Payment"; } }
    public decimal Amount { get; protected set; }
    public PaymentOption PaymentOption { get; protected set; }
}

次に、このドメインモデルに基づいてASP.NET MVCプロジェクトのViewModelを構築する必要があります。これにより、すべてのイベントが1つのクラスにカプセル化され、ビューでのグリッド表示が可能になります。

public class OrderHistoryViewModel
{
    public OrderHistoryViewModel(OrderEvent orderEvent)
    {
        // Here's my doubt

    }

    public string Date { get; protected set; }
    public string Description { get; protected set; }
    public string Amount { get; protected set; }
}

switchやifのような臭いことをせずに、PaymentEventのAmountプロパティなど、具象クラスから特定のプロパティにアクセスするにはどうすればよいですか?

ありがとう!

4

1 に答える 1

2

途中で、.NET 4 以降を使用していることを許可された二重ディスパッチを行うことです。

public class OrderHistoryViewModel
{
    public OrderHistoryViewModel(OrderEvent orderEvent)
    {
       // this will resolve to appropriate method dynamically
       (this as dynamic).PopulateFrom((dynamic)orderEvent);
    }

    void PopulateFrom(CancellationEvent e)
    {
    }

    void PopulateFrom(PaymentEvent e)
    {
    }

    public string Date { get; protected set; }
    public string Description { get; protected set; }
    public string Amount { get; protected set; }
}

個人的には、この種のコードで if/switch ステートメントを実行してもかまいません。これはアプリケーション境界コードであり、あまりきれいである必要はなく、明示的であると役立ちます。C# が本当に必要としているのは、 F# の共用体型などの代数型です。このようにして、コンパイラはすべてのケース (サブタイプ) を明示的に処理することを保証します。

于 2012-12-07T19:11:31.590 に答える