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



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

    产品

和相关的ViewModel

  1. OrderDetailsViewModel

在我的"OrderDetailsViewModelMapper"映射器文件中,我手动将这2个DomainModels映射到我的ViewModel。Mapper文件"OrderDetailsViewModelMapper"将调用我的存储库方法,该方法将访问DB并返回我的2个DomainModels,即product和Order,之后将它们映射到存储库本身。mapper只是调用repository并获取它的DomainModels。我不想要Automapper。现在我有两个问题。

  1. 是否上述流填充我的ViewModel违反任何最佳实践?
  2. 我可以保留产品类型的2个属性吗?像下面这样在我的"OrderDetailsViewModel"中排序,只映射那些属性而不是复制"OrderDetailsViewModel"中的所有属性。把它们单独映射吗?
public class OrderDetailsViewModelMapper
{
public Product Product{ get; set; }
public Order Order{ get; set; }
}

我想你是弄错了。

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

  • 第二,最好的视图模型是保持原始属性

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

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

更新:

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

最新更新