微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc – ASP.NET MVC视图模型的最佳做法

我的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项目中创建一个新的“Person”类,它反映“Person”数据合同中的属性

WCF服务调用隐藏在接口后面.似乎是让接口引用数据契约使我的接口是一个漏洞的抽象.不过,我有几个人相信在我的MVC项目中创建一个额外的“Person”类,反映数据合同是代码膨胀.

围绕这种分层/解耦的最佳做法是什么?

解决方法

Should my view model be referencing the “Person” data contract that is returned from the data service?

不,避免这种情况,给开发人员使用视图模型的错误印象.在进行代码审查时,我经常会看到这样的代码

public class Myviewmodel
{
    public SomeDomainModel1 Model1 { get; set; }
    public SomeDomainModel2 Model2 { get; set; }
    ...
}

这是错的.当我批评他们不使用视图模型时,他们会告诉我,告诉我:“Darin,看,我正在使用视图模型”,不幸的是,这不是视图模式应该如何工作.它们不是围绕域模型的包装器.

Or should I create a new “Person” class in my MVC project that mirrors the properties on the “Person” data contract?

是的,您可以创建一个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简单易用:优秀.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐