0

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

  1. 产品
  2. 命令

和相关的 ViewModel

  1. 订单详情视图模型

在我的“OrderDetailsViewModelMapper”映射器文件中,我手动将这 2 个 DomainModels 映射到我的 ViewModel。映射器文件“OrderDetailsViewModelMapper”将调用我的存储库方法,该方法将访问数据库并在将它们映射到存储库本身之后返回我的 2 个域模型 ieProduct 和 Order。所以 mapper 只是调用存储库并获取它的 DomainModels。我不想要自动映射器。现在我对这种情况有 2 个问题。

  1. 上述填充我的 ViewModel 的流程是否违反了任何最佳实践?
  2. 我可以在我的“OrderDetailsViewModel”中保留 2 个 Product & Order 类型的属性,如下所示,只映射这些属性,而不是复制“OrderDetailsViewModel”中的所有属性并单独映射 tem?
public class OrderDetailsViewModelMapper
{
public Product Product{ get; set; }
public Order Order{ get; set; }
}
4

1 回答 1

0

我想你有些想念。

  • 首先,映射器类是静态类,它有一些静态方法将对象从一种类型映射到另一种类型。最好的方法是在你的 UI 中而不是在存储库中使用 Mapper。根据我在您的情况下看到的情况,这应该称为DTO而不是 Mapper。

  • 其次,视图模型最好的方法是保留原始属性以在视图中显示,而不是保留模型的导航属性。

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

例如

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

更新:

阅读您的评论后,您需要从您的存储库返回 DTO“数据传输对象”,或者您可以直接返回您的 ViewModel。这取决于您的应用程序的复杂性以及您想要管理它的人。

于 2013-05-05T21:39:17.730 回答