0

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() { }
}

そして、私のWebサービスには、次のメソッドがあります。

[WebMethod]
public Package GetPackage(int Id);


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

最初のメソッドは問題ありません(すべてのプロパティが返され、正常に機能します)が、2番目のメソッドでは、Documentsプロパティを公開せず、IDと名前のみを公開します...どうすればよいですか?

ありがとう

4

3 に答える 3

2

必要なプロパティのみを使用してデータ転送オブジェクトを作成します。

PackageDTO最初のメソッドは、と1:1になるように返されPackageます。2つ目は、プロパティPackageLightDTOのみを含むものを返します。IdName

于 2012-04-05T12:05:27.200 に答える
2

消費側のクライアントにドキュメントへのアクセスを許可したくないため、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は、パッケージにも同様のビューモデルオブジェクトを使用することを 提案しましたが、それらは同一であるため、コードが乱雑になるだけです。単純なPOCOである限りPackage、追加のクラスは必要ありません。ただし、インスタンスを追跡するO / Rマッパーを使用しているPackage場合は、それらをクライアントアプリに公開しないことをお勧めします。次に、代わりにKarelが提案したことを実行し、Package同様にPOCOビューモデルクラスを作成する必要があります。


1)それらをデータ転送オブジェクト(DTO)と呼ぶ人もいます。私はそれらをビューモデルと呼んでいます。他にも10個の名前があるに違いありません-すべての実用的な目的のために、それらは同じです。

于 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 に答える