har*_*ony 9 asp.net-mvc viewmodel
我的ASP.NET MVC站点连接到WCF服务以获取数据.WCF服务返回如下数据协定:
[DataContract]
public class Person
{
[DataMember]
public string First { get; set; }
[DataMember]
public string Last { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的MVC项目中的视图模型如下所示:
public class MyViewModel
{
public string SomeExtraField1 { get; set; }
public string SomeExtraField2 { get; set; }
public string SomeExtraField3 { get; set; }
public Person Person { set; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的视图模型是否应该引用从数据服务返回的"Person"数据协定?或者我应该在我的MVC项目中创建一个新的"Person"类,它反映了"Person"数据合同的属性?
WCF服务调用隐藏在接口后面.似乎有接口引用数据契约使我的界面漏洞抽象.但是,我有一些人认为在我的MVC项目中创建一个额外的"Person"类,反映数据契约是代码膨胀.
围绕这种分层/去耦的最佳实践是什么?
Dar*_*rov 17
我的视图模型是否应该引用从数据服务返回的"Person"数据协定?
不,避免这种情况,它会让开发人员误以为他们正在使用视图模型.在进行代码审查时,我经常会看到这样的代码:
public class MyViewModel
{
public SomeDomainModel1 Model1 { get; set; }
public SomeDomainModel2 Model2 { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
那是错的.当我批评他们没有使用视图模型时,他们告诉我这个并告诉我:"Darin,看,我正在使用视图模型",遗憾的是视图模型不应该如何工作.它们不是域模型的包装器.
或者我应该在我的MVC项目中创建一个新的"Person"类,它反映了"Person"数据合同的属性?
是的,您可以创建一个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; }
}
Run Code Online (Sandbox Code Playgroud)
就您的域模型和视图模型之间的转换而言,AutoMapper简单地说:非常好.
归档时间: |
|
查看次数: |
4394 次 |
最近记录: |