0

我需要返回 Employee 类作为对我的 clientA 的响应,如下所示。

[OperationContract]

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

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

但这里的问题是客户 B 将使用我的服务,但需要员工的 SSN。如果我将它添加到 Employee 类中,我也会发送给不需要它的 clientA。如何克服这种情况。如果我必须对自定义反序列化做任何事情,如果我要处理 1000 个属性,这不是问题吗?

哪个是更好的解决方案?任何 wcf 架构帮助也会更有帮助。

4

4 回答 4

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;
}

该类EmployeeSSN根据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 回答
1

如果不同的客户有不同的需求,正确的做法是创建不同的服务。

您将业务逻辑放在共享业务类中(或分布在多个共享业务类中),并针对不同类型的客户端公开不同的服务。这让事情变得美好、抽象和安全,没有人得到他们不需要或不想要的数据。

于 2012-12-17T14:31:47.827 回答
0

我第二 Roy,但是如果这是客户端 A 和 B 之间的唯一区别。公开带有参数 IsSSNRequired 的 GetEmployee 方法并没有什么坏处,该参数可以具有默认的 false 值。

于 2012-12-17T14:38:31.820 回答