'ViewModel'可以保存'DomainModel'类型属性

时间:2013-05-05 19:32:15

标签: asp.net-mvc-4 viewmodel mapper asp.net-mvc-viewmodel view-model-pattern

在asp.net MVC 4中,我有2个DomainModels

  
      
  1. 产品
  2.   
  3. 顺序
  4.   

和相关的ViewModel

  
      
  1. OrderDetailsViewModel
  2.   

在我的“OrderDetailsViewModelMapper”映射器文件中,我手动将这两个DomainModel映射到我的ViewModel。 Mapper文件“OrderDetailsViewModelMapper”将调用我的存储库方法,该方法将访问数据库并在将它们映射到存储库本身后返回我的2个DomainModels ieProduct和Order。因此映射器只是调用存储库并获取它的DomainModels。我不想要Automapper。现在我对这个场景有2个问题。

  
      
  1. 上面提到的填充我的ViewModel的流程是否违反了任何最佳做法?
  2.   
  3. 我可以保留2种产品类型的属性吗?在我的“OrderDetailsViewModel”中排序,如下所示,只是映射这些属性   而不是复制“OrderDetailsViewModel”中的所有属性   也是单独映射tem?
  4.   
public class OrderDetailsViewModelMapper
{
public Product Product{ get; set; }
public Order Order{ get; set; }
}

1 个答案:

答案 0 :(得分:0)

我想你有点想念。

  • 首先,mapper类是具有一些静态方法的静态类 将对象从一种类型映射到另一种类型。而最好的方法是使用 您的UI中的Mapper不在存储库中。从我在你看到的 这应该叫做 DTO 而不是Mapper。

  • 其次,视图模型的最佳选择是将原始属性保存到 在视图中显示不保存模型的导航属性。

将数据从存储库提供给ViewModel (列表或单个对象)的最佳方法是对IQueryable<Model>使用 Projection ,在这种情况下您不需要创建DTO,只需投影到合适的ViewModel

即可

e.g。

var list = repository.Query.Select(m=>new ViewModel{
                                      First = m.First.Something,
                                      Second = m.Second.SomethingElse});

更新

阅读完评论后,您需要从您的存储库返回DTO“数据传输对象”,否则您可能会直接返回您的ViewModel。 这取决于您的应用程序的复杂程度以及您希望管理的对象。