初识MVC框架--Model与ViewModel
Model:领域模型,与数据库建模一一对应。ViewModel:用户视图模型,与View层用户操作直接关联。
本文以
软件开发平台中客户(Customer)为例进行说明。
一个简单的Model
Web开发框架中MVC架构,本来就只有一个Model的,这个Model在领域驱动开发中主要担任领域模型的角色,和业务逻辑紧密关联的,直接与数据库表进行映射的
/// <summary>
/// 物料
/// </summary>
public partial class Inventory
{
/// <summary>
/// ID
/// </summary>
public int InventoryID { get; set; }
/// <summary>
/// 物料编码
/// </summary>
[Required]
public string Code { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public bool IsEnabled { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? CreateAt { get; set; }
/// <summary>
/// 创建人
/// </summary>
public string CreateBy { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? ModifyAt { get; set; }
/// <summary>
/// 修改人
/// </summary>
public string ModifyBy { get; set; }
/// <summary>
/// 从属于哪个系列ID
/// </summary>
public int? SerialID { get; set; }
/// <summary>
/// 系列模型
/// </summary>
public InventorySerial InventorySerial { get; set; }
/// <summary>
/// 系列名称。
/// </summary>
public string SerialName
{
get { return InventorySerial == null ? "" : InventorySerial.SerialName; }
}
}
模型里面有一个自增长的InventoryID,包含物料编号Code及属于哪个系列等属性,这些在数据库中物料表都有对应的字段,通过EntityFramework进行模型映射。
一个简单的ViewModel
但是在比较复杂的业务场景中,一个领域模型已经不能满足于开发这一场景,已经需要借助第二个模型,我们姑且叫做用户模型,即与用户直接打交道的视图模型(ViewModel)
/// <summary>
/// 物料
/// </summary>
public partial class Inventory
{
/// <summary>
/// ID
/// </summary>
public int InventoryID { get; set; }
/// <summary>
/// 物料编码
/// </summary>
[Required]
public string Code { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public bool IsEnabled { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? CreateAt { get; set; }
/// <summary>
/// 创建人
/// </summary>
public string CreateBy { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? ModifyAt { get; set; }
/// <summary>
/// 修改人
/// </summary>
public string ModifyBy { get; set; }
/// <summary>
/// 从属于哪个系列ID
/// </summary>
public int? SerialID { get; set; }
/// <summary>
/// 系列模型
/// </summary>
public InventorySerial InventorySerial { get; set; }
/// <summary>
/// 系列名称。
/// </summary>
public string SerialName
{
get { return InventorySerial == null ? "" : InventorySerial.SerialName; }
}
}
ViewModel顾名思义是应用于View层的(这和MVVM原理同,当然我们也可以在View层直接使用MVVM架构,这个不是我们讨论的范围,有兴趣的伙伴可以查看AngularJS相关知识。),在Controller层(或服务层)将Model转化为ViewModel后,再Reponse给View层进行数据绑定。
Model与ViewModel关联
Model和ViewModel的转化通过深拷贝来进行,两者除了数据复制外不要有任何关联,我们可以通过new模型实例进行相应属性值拷贝来转化,也可以通过automapper组件来傻瓜式转化。
直接写代码转化:
//Customer customer 已经有值的对象
CustomerViewModel customerViewModel =new CustomerViewModel
{
/// <summary>
/// ID,视图中隐藏属性
/// </summary>
CustomerID=customer.CustomerID,
/// <summary>
/// 客户编码
/// </summary>
Code=customer.Code,
/// <summary>
/// 客户名称
/// </summary>
Name =customer.Name ,
/// <summary>
/// 客户地址1
/// </summary>
Address1 =customer.Address1,
/// <summary>
/// 客户地址2
/// </summary>
Address2 =customer.Address2;
/// <summary>
/// 客户地址3
/// </summary>
Address3 =customer.Address3 ,
/// <summary>
/// 所在城市
/// </summary>
City =customer.City
AutoMapper傻瓜式转化:
CustomerViewModel customerViewModel=customer.ToModel();