在我的ASP.NET MVC应用程序中,我正在使用工作单元和存储库模式进行数据访问.
使用工作类单元和在其中定义的存储库,我在控制器中获取相关的实体集.凭借我的初学者知识,我可以想到两种获取业务模型的方法,并将其转换为查看模型.
> Repository将业务模型返回给控制器,该模型比映射到查看模型,或者
>存储库本身将业务模型转换为查看模型,然后返回给控制器.
目前我正在使用第一种方法,但是我的控制器代码对于具有很多属性的视图模型开始看起来很丑陋.
另一方面,我想,由于我的存储库被称为UserRepository(例如),它应该直接返回业务模型,而不是仅对单个视图有用的某些模型.
你认为哪一个更适合大型项目?有办法吗?
谢谢.
解决方法
存储库应返回域模型,而不是查看模型.就模型和视图模型之间的映射而言,我个人使用
AutoMapper,所以我有一个单独的映射层,但这个层是从控制器调用的.
以下是典型的GET控制器操作可能如下所示:
public ActionResult Foo(int id) { // the controller queries the repository to retrieve a domain model Bar domainModel = Repository.Get(id); // The controller converts the domain model to a view model // In this example I use AutoMapper,so the controller actually delegates // this mapping to AutoMapper but if you don't have a separate mapping layer // you could do the mapping here as well. Barviewmodel viewmodel = Mapper.Map<Bar,Barviewmodel>(domainModel); // The controller passes a view model to the view return View(viewmodel); }
当然可以用自定义的动作过滤器来缩短,以避免重复的映射逻辑:
[AutoMap(typeof(Bar),typeof(Barviewmodel))] public ActionResult Foo(int id) { Bar domainModel = Repository.Get(id); return View(domainModel); }
AutoMap自定义操作过滤器预订了OnActionExecuted事件,拦截传递给视图结果的模型,调用映射图层(AutoMapper在我的情况下)将其转换为视图模型并将其替换为视图.视图当然是强烈类型的视图模型.