viewmodel - 视图模型 ASP.NET 视图模型最佳实践

  显示原文与译文双语对照的内容

我的ASP.NET MVC站点连接到一个WCF服务来获取数据。 WCF服务返回这样的数据协定:


[DataContract]


public class Person


{


 [DataMember]


 public string First { get; set; }



 [DataMember]


 public string Last { get; set; }


}



我的MVC项目中的视图模型如下所示:


public class MyViewModel


{


 public string SomeExtraField1 { get; set; }


 public string SomeExtraField2 { get; set; }


 public string SomeExtraField3 { get; set; }



 public Person Person { set; set; }


}



视图模型应该引用从数据服务返回的"人员"数据协定? 还是应该在我的MVC项目中创建一个新的"人员"类,该类反映"人员"数据契约的属性?

WCF服务调用隐藏在接口后面。 看起来有接口引用数据协定使我的接口成为漏洞的抽象。 然而,我有一些人相信在我的MVC项目中创建一个额外的"人员"类,该类反映了数据契约的代码膨胀。

这类分层/解耦的最佳实践是什么?

时间: 原作者:

视图模型应该引用从数据服务返回的"人员"数据协定?

不,避免这样做,它给开发者的false 印象是他们正在使用视图模型。 我经常在执行代码审查时看到这样的代码:


public class MyViewModel


{


 public SomeDomainModel1 Model1 { get; set; }


 public SomeDomainModel2 Model2 { get; set; }


. . .


}



这是错误的。当我对他们进行评论时,不用视图模型,他们会告诉我这个,告诉我: "darin听着我在用视图模型",不幸的是,视图模型不是应该工作的。 它们不是域模型的包装器。

还是应该在我的MVC项目中创建一个新的"人员"类,该类反映"人员"数据契约的属性?

是,可以创建 PersonViewModel 并只包含你的视图所需的属性。

或者,如果要设计这里视图模型的特定视图只需要某些属性,也可以使它的看起来如下:


public class MyViewModel


{


 public string SomeExtraField1 { get; set; }


 public string SomeExtraField2 { get; set; }


 public string SomeExtraField3 { get; set; }



//this would be for example the concatenation of your domain model 


//first name and last name as that's what this particular view needs to 


//display


 public string PersonFullName { set; set; }


}



对于你的域模型和视图模型之间的转换,只需将 AutoMapper 设置为: 精彩。

原作者:
...