如何只显示Web服务结果中的某些字段?

时间:2012-04-05 12:01:31

标签: c# asp.net wcf linq web-services

我在asp.net中有一个Web服务,我有这个模型返回:

[Seriazable]
public class Package {

    public int Id { get; set; }
    public string Name { get; set; }
    public string List<Document> Documents { get; set; }

    public Package() { }
}

在我的网络服务中,我有以下方法:

[WebMethod]
public Package GetPackage(int Id);


[WebMethod]
public List<Package> FindPackage();

第一种方法是ok(返回所有属性并且工作正常),但第二种方法我不想暴露Documents属性,只有Id和Name ...我该怎么办?

由于

3 个答案:

答案 0 :(得分:2)

仅使用所需属性创建数据传输对象。

第一种方法将返回PackageDTOPackagePackageLightDTO为1:1。 第二个将返回仅包含IdName属性的{{1}}。

答案 1 :(得分:2)

由于您不希望使用客户端访问文档,因此您应为第二种方法创建单独的视图模型 1 类。像这样:

public class SimplePackageViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后,您可以使用某个映射实用程序(例如AutoMapper)实例化此类的对象,并返回这些对象:

[WebMethod]
public List<SimplePackageViewModel> FindPackage();
[WebMethod]
public Package GetPackage(int id);

Karel Frajtak suggested您也为包使用了类似的视图模型对象,但由于它们是相同的,只会使您的代码混乱 - 只要Package是一个简单的POCO ,没有必要额外的课程。但是,如果您使用一些跟踪Package实例的O / R映射器,则明智的做法是不将它们暴露给客户端应用程序。然后你应该做Karel建议的,并为Package创建一个POCO视图模型类。


1)有些人称他们为数据传输对象(DTO)。我称他们为View Models。我打赌那里还有十个其他的名字 - 出于所有实际目的,它们是相同的。

答案 2 :(得分:0)

我会改变我的做法:

[Seriazable]
public class Package {

    public int Id { get; set; }
    public string Name { get; set; }

    public Package() { }
}


[Seriazable]
public class PrivatePackage : Package{

    public string List<Document> Documents { get; set; }

}


[Seriazable]
public class PublicPackage : Package {


}


[WebMethod]
public Package GetPackage(int Id);

[WebMethod]
public PublicPackage GetPublicPackage(int Id);

[WebMethod]
public PrivatePackage GetPublicPackage(int Id);


[WebMethod]
public List<PrivatePackage> FindPrivatePackage();

[WebMethod]
public List<PublicPackage> FindPublicPackage();