【问题标题】:How to support different clients with single WCF service如何使用单个 WCF 服务支持不同的客户端
【发布时间】:2012-12-17 14:28:49
【问题描述】:

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

[OperationContract]

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

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

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

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

【问题讨论】:

    标签: c# wcf wcf-data-services


    【解决方案1】:

    如果不同的客户有不同的需求,也应该创建不同的服务。

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

    【讨论】:

    • 你的意思是,我必须为每个服务合同创建两个不同的员工类别?
    • 是的。你让你的合约尽可能的严格:只需要实际需要的参数,只返回实际需要的数据。这需要更多的工作,但您的最终结果会更清晰、更安全。
    【解决方案2】:

    对此link 进行了非常相似的讨论。基本上,它是指有条件地隐藏数据成员的值。

    您可以根据客户端 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 类将根据IsSSNSerializable 属性的值公开SSN

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

    【讨论】:

      【解决方案3】:

      我建议您阅读可能与您的场景匹配的versioning strategies of the WCF

      就我而言,我在数据契约上实现了 IExtensibleDataObject 并在这一层而不是服务契约层进行管理。

      缺点是难以跟踪不同版本的合同,但我正在练习半严格版本控制并且对我来说效果很好。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 在开发过程中我可能会遇到很多变化。所以这不会是唯一的不同
        • 我会说从单一服务开始,当你认为你正在做一些安静的工作时 - 重构为多服务方法。这只是一个开始的建议。根据偏差的数量和大小,您将是判断您要如何做的最佳人选。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多