0

次のように、clientAへの応答としてEmployeeクラスを返す必要があります。

[OperationContract]

    public Employee GetEmployee(String id)
    {
    ..
    ..
    return emp;
    }

    public class Employee 
    {
    public string Name;
    public string phoneNo;
    }

しかし、ここでの問題は、clientBが私のサービスを消費することですが、従業員のSSNが必要です。Employeeクラスに追加すると、必要のないclientAにも送信されます。この状況を克服する方法。カスタムデシリアライズで何かをしなければならない場合、何千ものプロパティを処理しようとしても問題はありませんか?

どちらがより良い解決策ですか?wcfアーキテクチャのヘルプもさらに役立ちます。

4

4 に答える 4

1

クライアントごとに異なるニーズがある場合、適切なことは、異なるサービスも作成することです。

ビジネス ロジックを共有ビジネス クラスに配置 (または複数の共有ビジネス クラスに分散) し、異なるタイプのクライアントごとに異なるサービスを公開します。これにより、物事が適切に抽象化され、安全に保たれ、不要なデータや不要なデータを取得する人はいません。

于 2012-12-17T14:31:47.827 に答える
1

このリンクで非常によく似た議論がありました。基本的には、データメンバーの値を条件付きで隠すことを指します。

クライアント ID または資格情報 (サービス メソッド呼び出しにパラメーターとして渡す必要があります) に基づいて、データ メンバーを公開するかどうかを決定できます。

[OperationContract]
public Employee GetEmployee(int clientId, String id)
{
    var employee = new Employee();

    //here you might use a mapping table between the clients and the exposed data members
    if (clientId == 1)
    {
        employee.IsSSNSerializable = true;
    }
    return employee;
}

このEmployeeクラスは、プロパティSSNの値に基づいてを公開します。IsSSNSerializable

[DataContract]
public class Employee
{
    public bool IsSSNSerializable = false;

    [DataMember]
    public string Name;
    [DataMember]
    public string phoneNo;

    public string SSN;

    [DataMember(Name = "SSN", EmitDefaultValue = false)]
    public string SSNSerializable
    {
        get
        {
            if (!IsSSNSerializable)
                return null;
            return SSN;
        }
        set
        {
            SSN = value;
        }
    }
}
于 2012-12-17T14:41:04.240 に答える
1

シナリオに一致する可能性のある WCFのバージョン管理戦略を読むことをお勧めします。

私の場合、データ コントラクトに IExtensibleDataObject を実装し、サービス コントラクト レイヤーではなくこのレイヤーで管理します。

欠点は、さまざまなバージョンのコントラクトを追跡するのが難しいことですが、私は半厳密なバージョン管理を実践しており、うまく機能しています。

于 2012-12-17T15:12:21.887 に答える
0

私は Roy に二番目ですが、これがクライアント A と B の唯一の違いである場合は、既定の false 値を持つことができるパラメーター IsSSNRequired を使用して GetEmployee メソッドを公開しても問題はありません。

于 2012-12-17T14:38:31.820 に答える