我很好奇所有的人们建立他们的viewmodels的各种方式,为什么他们选择这种方法。
我可以在这里想到几种方法:
-1。注入存储库 – 控制器加载模型并映射到viewmodel。这里的viewmodel构造函数可以采取各种集合inter为inter设置。在选择列表如:
public CustomerController(ISomeRepository repository) { _repository = repository; } public ActionResult Create() { CustomerCreateviewmodel model = new CustomerCreateviewmodel(_repository.GetShipTypes,_repository.GetStates); .. .. }
-2。 viewmodelBuilder – 在控制器中注入或实例化注入的存储库的实例。通过类似的东西调用
>var orderviewmodel = orderviewmodelBuilder.WithStates().Build(orderId);
要么,
var orderviewmodel = orderviewmodelBuilder.WithStates().Build(orderId);
-3。直接在控制器(没有代码需要 – 它的凌乱)
-4。一些其他服务(注入或不注入)返回控制器映射的域模型,或者一个viewmodel(任何人执行此操作返回一个没有明确命名/注释为viewmodel构建器类的视图模型)。
public JobCreateviewmodel BuildJobCreateviewmodel(int parentId) { JobCreateviewmodel model = new JobCreateviewmodel(); model.JobStatus = _unitOfWork.JobRepository.GetJobStatuses(); model.States=_unitOfWork.StateRepository.GetAll(); return model; }
现在返回旅行 – 关于验证视图模型 – 是从标准验证的基本viewmodel类继承,还是在所有viewmodel之间复制验证(例如数据注释属性),或者仅仅依赖服务器端验证,都可以验证againt你的域对象?
任何其他?什么更好?为什么?
编辑
基于以下链接,我找到了一个来自Jimmy Bogard的关于viewmodels架构的好文章。虽然它不直接解决上面的问题,这是任何人来到这里的viewmodel信息的很好的参考。
http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/
解决方法
我将一个服务注入控制器,而不是存储库,然后使用
AutoMapper将其转换为视图模型。在这种情况下,服务层的好处是它可以将来自一个或多个存储库的多个简单操作聚合到暴露域模型的单个操作中。例:
private readonly ICustomerService _service; public CustomerController(ICustomerService service) { _service = service; } [AutoMap(typeof(Customer),typeof(Customerviewmodel))] public ActionResult Create(int id) { Customer customer = _service.GetCustomer(id); return View(customer); }
在本示例中,AutoMap是一个自定义操作过滤器,我可以编写它在控制器操作后执行,检查返回的对象,并使用定义的AutoMapper映射将其映射到指定的目标类型。所以视图获得相应的Customerviewmodel作为模型类型。将等同于:
public ActionResult Create(int id) { Customer customer = _service.GetCustomer(id); Customerviewmodel vm = Mapper.Map<Customer,Customerviewmodel>(customer); return View(vm); }
它只是它是太多的管道和重复的代码,可以集中。
我也建议你看Jimmy Bogard的putting your controllers on a diet video。