2016-10-31 6 views
0

新しいViewModel()で提供されるCreate.cshtmlをレンダリングしています。フォームを送信する前に、Ajaxを使用して価格を計算したいと考えています。私のビューモデルは計算方法や機能を複製したいのか分からない。この動作は、カプセル化の根拠となるドメインモデルにあります。ドメインモデルとビューモデル間でロジックを共有する正しい方法

Ajaxを使用して、ドメインモデルが作成される前に、フォーム自体を完成する前に、ユーザーに合計価格を指定する「Calculate」アクションメソッドを呼び出したいと思います。

どのようにカプセル化を破ることなくこの機能を達成できますか?

注:処理の後半で、バスケット/支払い/処理の前にDomainModelが計算に使用されます。

public class DomainModel 
{ 
public int Id { get; set; } 
public int Quantity { get; set; } 
public decimal Price { get; set; } 

public decimal Calculate() 
{ 
    return Quantity*Price; 
} 
} 

public class ViewModel 
{ 
    [Required] 
    public int Id { get; set; } 
    [Required] 
    public int Quantity { get; set; } 
    public decimal Price { get; set; 
} 
+0

私はクラスをパラメータと、基底クラスに計算()を配置することなく使用について同僚と議論しました自身の特性。基底クラスは、DomainモデルとViewモデルの両方に継承できますが、これは間違っているだけです。 – ManxJason

+0

これらの計算を行う責任を別のクラス(TotalCalculator)に委譲し、そのクラスのインスタンスをDomainModelおよびViewModel内で使用して計算を行うことができます。継承の代わりにコンポジションを使用します。 – AdaTheDev

+0

@AdaTheDevあなたの方法と静的電卓との違いは何ですか?この場合、インスタンスを持つ利点は何ですか? – ManxJason

答えて

1

インターフェイス拡張を利用して、それぞれ特定のインターフェイスを実装することができます。

public interface MyAwesomeInterface 
{ 
    int Quantity { get; } 
    decimal Price { get; } 
} 

そして:

public class DomainModel : MyAwesomeInterface 

public class ViewModel : MyAwesomeInterface 

最後たとえば

public static class MyAwesomeInterfaceExtensions 
{ 
    public static Calculate(this MyAwesomeInterface foo) 
    { 
     return foo.Quantity * foo.Price; 
    } 
} 
+0

これは私の心を越えていませんでした。元の基本クラスのアプローチよりもはるかにクリーンです。再度、感謝します。 – ManxJason

関連する問題