我可以在这里想到几种方法:
-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/
解决方法
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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。