我在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 ...我该怎么办?
由于
答案 0 :(得分:2)
仅使用所需属性创建数据传输对象。
第一种方法将返回PackageDTO
,Package
与PackageLightDTO
为1:1。
第二个将返回仅包含Id
和Name
属性的{{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();