我会让服务层返回一个域模型并将其映射到控制器中的 ViewModel。
通过这种方式,您可以使用具有多个 ViewModel 的服务方法,例如用于桌面和移动视图。
您可以让AutoMapper为您完成繁重的工作或手动完成,方法是在 ViewModel 中创建一个接受域模型的构造函数。
领域模型:
public class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Telephone { get; set; }
public string Email { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}
视图模型:
public class CustomerWithOrdersModel
{
public CustomerWithOrdersModel(Customer customer)
{
Id = customer.Id;
FullName = string.Format("{0}, {1}", customer.LastName, customer.FirstName);
Orders = customer.Orders.ToList();
}
public int Id { get; set; }
public string FullName { get; set; }
public IEnumerable<Order> Orders { get; set; }
}
编辑:AutoMapper 示例:
AutoMapper 配置文件包含从 aCustomer到 a的映射CustomerWithOrdersModel:
public class ViewModelProfile : Profile
{
public override string ProfileName
{
get { return "ViewModel"; }
}
protected override void Configure()
{
CreateMap<Customer, CustomerWithOrdersModel>()
.ForMember(dest => dest.FullName, opt => opt.MapFrom(src => string.Format("{0}, {1}", src.LastName, src.FirstName)))
.ForMember(dest => dest.Orders, opt => opt.MapFrom(src => src.Orders.ToList()));
}
}
Id按约定映射。
的扩展方法ViewModelProfile:
public static class ViewModelProfileExtensions
{
public static CustomerWithOrdersModel ToModel(this Customer customer)
{
return Mapper.Map<CustomerWithOrdersModel>(customer);
}
public static Customer ToEntity(this CustomerWithOrdersModel customerWithOrdersModel)
{
return Mapper.Map<Customer>(customerWithOrdersModel);
}
}
控制器动作:
public ActionResult Details(int customerId)
{
Customer customer = _customerService.GetById(customerId);
CustomerWithOrdersModel customerWithOrders = customer.ToModel();
return View(customerWithOrders);
}
如果您创建一个从CustomerWithOrdersModelto的映射Customer,您可以使用customerWithOrdersModel.ToEntity()它来将其映射回域模型。
就是这样!您可以Customer从 ViewModel 中删除带有域模型的构造函数。