服务器方法中的额外参数

时间:2014-04-29 05:54:22

标签: c# web-services oop

我对在服务器上扩展方法的后果有疑问,如果您帮助我,我感激不尽。

我们假设如下。 我在服务器上的外观中有一个方法:

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

我需要提供向后兼容性。因此,如果用户使用旧版本并且他尝试仅使用单个参数调用此方法,那么会发生什么? 服务器会猜测这是同一种方法并调用它吗?如果是,“模式”字符串(第二个参数)是空还是空?或者它只会抛出一个异常,说客户端试图调用一个不存在的函数。是否可以在不使用一个和两个参数复制方法的情况下解决此问题。

3 个答案:

答案 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”中轻松处理它。本身就提供了向后兼容性。