0

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

[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();

第一种方法没问题(所有属性都返回并且工作正常),但是第二种方法我不想公开 Documents 属性,只有 Id 和 Name ......我该怎么做?

谢谢

4

3 回答 3

2

仅创建具有所需属性的数据传输对象。

第一种方法将返回PackageDTO1:1 与Package. 第二个将返回PackageLightDTO仅包含IdName属性。

于 2012-04-05T12:05:27.200 回答
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 建议您也为包使用类似的视图模型对象,但由于它们相同,只会使您的代码混乱 - 只要Package是简单的 POCO,就不需要额外的类。但是,如果您使用一些跟踪Package实例的 O/R-mapper,最好不要将它们暴露给客户端应用程序。然后你应该按照 Karel 的建议去做,并为它创建一个 POCO 视图模型类Package


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

于 2012-04-05T12:10:47.473 回答
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();
于 2012-04-05T12:09:29.150 回答