2012-12-17 23 views
0

我需要返回Employee类作为对clientA的响应,如下所示。如何使用单个WCF服务支持不同的客户端

[OperationContract] 

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

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

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

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

回答

1

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

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

+0

你的意思是说,我必须为每个服务合同创建两个不同的员工类别? –

+0

是的。您尽可能严格地制定合同:只需要实际需要的参数,并且只返回实际需要的数据。这是一个更多的工作,但最终的结果是更清晰和更安全。 –

0

我是第二个Roy,但是如果这是客户端A和B之间的唯一区别。使用参数IsSSNRequired公开一个可以具有默认假值的GetEmployee方法并不会伤害。

+0

当开发进展的时候,我可能会遇到很多变化。所以这不会是唯一的不同 –

+0

我想说的是从单一服务开始,当你认为你正在做一些安静的工作时 - 重构多种服务方式。这只是一个建议。根据偏差的数量和规模,您将成为判断您想如何做的最佳人选。 – humblelistener

1

关于此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; 
     } 
    } 
} 
1

我建议你把versioning strategies of the WCF,可能是与你的情况下比赛的一读。

对于我的情况,我在数据合同上实现了IExtensibleDataObject,并在这一层管理而不是服务合同层。

不利的一面是很难跟踪不同版本的合同,但是我正在练习半严格的版本控制并且适合我。

相关问题