2012-10-20 15 views
2

我在我的項目中使用Windows通信服務(WCF)。使用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); 
. 
. 

是不是? 有沒有什麼方法? 還是我做對了?

我研究並發現這一點: Function Overloading in WCF

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

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

,他說

但我不喜歡它,因爲它有時會導致混亂。

還有其他方法嗎? 謝謝。

+1

爲什麼你要編寫函數'GetStackOverFlow(id,name)'來過濾ID和名稱?我假設「ID」只會返回一個對象。你還能過濾多少? – Andreas

+0

好方法,但不認爲只有id有時一個Id可以有多個行,所以我不得不使用更多的過濾器.. –

回答

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但你得到它的想法。 這樣做的好處之一是,當您部署更新版本的服務時,您可以輕鬆擴展該類,而不會中斷客戶端的功能。

+0

是的有一些查詢對象可能是他們的方式,我會去。 –

1

你做得很好,這是你如何在WCF中重載方法(使用name屬性)。我沒有看到比使用name屬性重載方法更好的方法。