我需要返回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架构帮助也会更有帮助。
答案 0 :(得分:1)
如果不同的客户有不同的需求,那么正确的方法是创建不同的服务。
您将业务逻辑放在共享业务类中(或分布在多个共享业务类上),并为每种不同类型的客户端公开不同的服务。这样可以保持良好,抽象和安全,并且没有人获得他们不需要或不想要的数据。
答案 1 :(得分: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
类会根据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;
}
}
}
答案 2 :(得分:1)
我建议您阅读可能与您的方案匹配的versioning strategies of the WCF。
对于我的情况,我在数据契约上实现了IExtensibleDataObject,并在此层而不是服务契约层进行管理。
缺点是跟踪不同版本的合同会有困难,但是我正在练习半严格版本,对我来说效果很好。
答案 3 :(得分:0)
我是第二个Roy,但是如果这是客户端A和B之间的唯一区别。使用参数IsSSNRequired公开可能具有默认false值的GetEmployee方法也没有坏处。