我对在服务器上扩展方法的后果有疑问,如果您帮助我,我感激不尽。
我们假设如下。 我在服务器上的外观中有一个方法:
public void SaveSomeData(SomeDataEntity[] someDataEntities)
{
someDataLocator.SaveData(someDataEntities);
}
并从以下客户端调用它:
public void SaveSomeData(SomeDataEntity[] someDataEntities)
{
this.Invoke("SaveSomeData", new object[] { someDataEntities });
}
现在,我需要将其扩展到
public void SaveSomeData(SomeDataEntity[] someDataEntities, string mode)
{
someDataLocator.SaveData(someDataEntities, mode);
}
我需要提供向后兼容性。因此,如果用户使用旧版本并且他尝试仅使用单个参数调用此方法,那么会发生什么? 服务器会猜测这是同一种方法并调用它吗?如果是,“模式”字符串(第二个参数)是空还是空?或者它只会抛出一个异常,说客户端试图调用一个不存在的函数。是否可以在不使用一个和两个参数复制方法的情况下解决此问题。
答案 0 :(得分:2)
您可以简单地将旧签名标记为已过时,然后使用字符串空
调用新签名[Obsolete]
public void SaveSomeData(SomeDataEntity[] someDataEntities)
{
someDataLocator.SaveData(someDataEntities, string.Empty);
}
答案 1 :(得分:2)
WCF不支持方法重载,因为WSDL不允许有两个具有相同名称的方法。您可以通过在重载方法上为OperationContract提供Name属性来实现它。
[OperationContract(Name="SaveSomeDataDefault")]
public void SaveSomeData(SomeDataEntity[] someDataEntities)
{
this.Invoke("SaveSomeData", new object[] { someDataEntities });
}
[OperationContract(Name="SaveSomeDataWithMode")]
public void SaveSomeData(SomeDataEntity[] someDataEntities, string mode)
{
someDataLocator.SaveData(someDataEntities, mode);
}
但这也不是一个好的做法,因为它会引导你调试跟踪等问题。实践是保持单独的方法而不是在WCF中使用重载。
答案 2 :(得分:1)
我通过实验找到了答案。
它理解这是必要的方法并调用它。 当我从一个在facade中具有单个参数的旧客户端调用此方法时,
public void SaveSomeData(SomeDataEntity[] someDataEntities, string mode)
{
someDataLocator.SaveData(someDataEntities, mode);
}
在mode
等于null
的服务器上执行。
所以,我可以在“someDataLocator”中轻松处理它。本身就提供了向后兼容性。