我有一个ASP.NET MVC 2应用程序与一个POCO域模型和一个NHibernate库层.我的域模型没有意识到我的视图模型,所以我使用automapper从viewmodel到实体和反之亦然.
当我向我的项目介绍WCF(迟到的要求)时,我开始处理断开的对象.也就是说,我使用NHibernate从数据库中检索一个实体,一旦该实体被序列化,它将被断开连接,并且每个子集合都被加载,而不管我是否计划使用它意味着我正在做很多不必要的数据库工作.
在阅读之后,我看到强烈建议您不要将您的实体暴露在您的域名项目之外,而应该使用DTO.
我看到这个原因,但我无法确定如何实现它.
在ASP.NET MVC中,将viewmodel映射到DTO,通过服务层发送DTO,并将DTO映射到服务层中的实体?我应该在哪里定义我的DTO?
解决方法
我喜欢让我的服务层保持实体封装,并返回/接收只有DTO.我将服务合同和DTO保留在MVC项目和服务实施参考的单独的程序集中.
在服务调用实现中,服务将dto映射到实体,然后根据需要与存储库和其他实体进行交互.
在应用程序/ mvc项目中,我有时会懒惰,只是使用DTO作为某些操作(特别是CRUDY)的模型.如果我需要一个投影或类似的东西,那么我将做一个视图模型,并在DTO和viewmodel之间用automapper等进行转换.
暴露你的实体是一个很多争论的话题.有些人会把它们推到视图/应用层.我宁愿把它们保留在服务层.我发现,当实体离开服务层时,您发现自己在与其进行交互的任何地方进行业务逻辑类型的处理,这些东西应该可能驻留在服务中.