在域模型和视图模型之间共享逻辑的正确方法

时间:2016-10-31 15:10:55

标签: asp.net-mvc-4 model-view-controller

我正在渲染一个随新ViewModel()提供的Create.cshtml。在我提交表单之前,我想使用Ajax来计算价格。我的视图模型不知道如何计算,也不想复制功能。此行为基于封装原因驻留在域模型中。

使用Ajax,我想打电话给'计算'控制器上的操作方法,在完成表单本身之前(在创建域模型之前)为用户提供总价格。

如何在不破坏封装的情况下实现此功能?

注意:在此过程的后期,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;
}

1 个答案:

答案 0 :(得分: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;
    }
}