在asp.net MVC 4中,我有2个DomainModels
- 产品
- 顺序
醇>
和相关的ViewModel
- OrderDetailsViewModel
醇>
在我的“OrderDetailsViewModelMapper”映射器文件中,我手动将这两个DomainModel映射到我的ViewModel。 Mapper文件“OrderDetailsViewModelMapper”将调用我的存储库方法,该方法将访问数据库并在将它们映射到存储库本身后返回我的2个DomainModels ieProduct和Order。因此映射器只是调用存储库并获取它的DomainModels。我不想要Automapper。现在我对这个场景有2个问题。
- 上面提到的填充我的ViewModel的流程是否违反了任何最佳做法?
- 我可以保留2种产品类型的属性吗?在我的“OrderDetailsViewModel”中排序,如下所示,只是映射这些属性 而不是复制“OrderDetailsViewModel”中的所有属性 也是单独映射tem?
醇>
public class OrderDetailsViewModelMapper
{
public Product Product{ get; set; }
public Order Order{ get; set; }
}
答案 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。 这取决于您的应用程序的复杂程度以及您希望管理的对象。