2

我在我的项目中使用 Windows 通信服务 (WCF)。

在我的项目中,

我编写如下函数:

GetUserNameByUserId(int userId);
GetProductInformationByProductId(int productId);

但是这个命名已经一天比一天复杂了。

例如,我有 5 个参数要传递给函数,在这种情况下,函数名称将如下所示:

GetStackOverFlowByStackByOverByFlowByIdByStackOverFlow(string stack, string over, string flow, int id, string stackOverFlow);

并假设我想获得 2 个参数,如打击:

GetStackOverFlowByIdByStackOverFlow(int id, string stackOverFlow);

我想使用如下函数重载:

public void abc(int i)
{
    System.Console.WriteLine("abc" + i);
}
public void abc(string i)
{
    System.Console.WriteLine("abc" + i);
}
public void abc(string i,int j)
{
    System.Console.WriteLine("abc" + i + j);
}

也就是说,我想写下面的函数:

GetStackOverFlow(int id);
GetStackOverFlow(int id, string name);
GetStackOverFlow(int id, string name, string StackOver);
.
.

不是吗?有什么方法吗?还是我做对了?

我研究并发现: WCF 中的函数重载

public interface IMyService
{
   [OperationContract(Name = "GetStringWithParam")]
   string GetString(DateTime date);

   [OperationContract(Name = "GetStringWithoutParam")]
   string GetString();
}

他说

但我不喜欢它,因为它有时会导致混乱。

还有其他方法吗?谢谢。

4

2 回答 2

3

您可以使用类作为参数。

[DataContract]
public class MySearchSettings
{

    [DataMember]
    public int? ID { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string StackOver { get; set; }

}

而不是创建这样的方法:

public GetStackOverflowResponse GetStackOverflow(MySearchSettings searchSettings)
{
    var response = new GetStackOverflowResponse();
    try
    {
        User user = null;
        if (searchSettings == null)
            throw new ArgumentNullException("searchSettings");
        if (searchSettings.ID.HasValue)
            user = //queryByID;
        else if (!String.IsNullOrEmpty(searchSettings.Name))
            user = //queryByName;
        else if (!String.IsNullOrEmpty(searchSettings.StackOver))
            user = //queryByStackOver;
        response.User = user;
    }
    catch(Exception e)
    {
        response.ErrorMessage = String.Format("{0}: {1}",
                                              e.GetType().Name,
                                              e.Message);
    }
    return response;
}

我没有包括GetStackOverflowResponse class但你明白了。这样做的好处之一是,在部署较新版本的服务时,您可以轻松扩展类而不会破坏客户端的功能。

于 2012-10-20T13:25:45.250 回答
1

你做得很好,这就是你在 WCF 中重载方法的方式(使用 name 属性)。我没有看到比使用 name 属性重载方法更好的方法。

于 2012-10-20T13:17:17.807 回答