2013-10-15 30 views
0

我有基於被傳入的用戶類型的返回數據的WCF服務此方法的定義是:WCF服務內部方法重載

[OperationContract] 
public Element GetElement(User user, int id) 

我的問題是,有許多方法在服務中,並且每一個都需要一個用戶,並且包含一個交換機來返回用戶類型的相關信息。即

switch(user.GetType()) 
{ 
    case typeOf(UserA): 
    break; 
    case typeOf(UserB): 
    break; 
    case typeOf(UserC): 
    break; 
} 

有沒有什麼辦法能夠實現以下結構,並自動WCF引導到正確的方法?可能是由某種行爲?

[OperationContract] 
public Element GetElement(User user, int id) 
{ 
    //DO NOTHING 
} 

public Element GetElement(UserA user, int id) 
{ 
    //Process for typeof UserA 
} 

public Element GetElement(UserB user, int id) 
{ 
    //Process for typeof UserB 
} 

public Element GetElement(UserC user, int id) 
{ 
    //Process for typeof UserC 
} 
+0

正確的用戶方法如果'User'是一個基類和'UserA'是一個子類,你就不能這樣做: 'user.ProcessGet(id)'或其他。 –

+0

我可以,也許是最好的解決方案,只是想知道是否有任何方式來實現它與WCF。 –

+0

您正在尋找的圖案稱爲Double Dispatch。 – Aron

回答

1

您可以通過執行IDispatchOperationSelector來做類似的事情。有一個很好的博客文章關於它here。那種事不傾向於通過線路很好地工作 -

您可以用雖然重載方法的名稱問題上運行英寸

在我看來,你應該避免暴露任何繼承層次公用數據合同。繼承是一個非常OO的概念,很好地適合於面向服務的上下文。

0

我建議如下:

玷污一個類庫項目中定義的服務合同

namespace ClassLibrary1 
{ 
    [ServiceContract] 
    public interface IService1 
    { 

     [OperationContract] 
     Element GetElement(User type); 

    } 

    [DataContract] 
    public class Element 
    { 
     [DataMember] 
     public string Name { get; internal set; } 
    } 


    [KnownType(typeof(UserA))] 
    [KnownType(typeof(UserB))] 
    [KnownType(typeof(UserC))] 
    public class User 
    { 

     public Element GetElement() 
     { 
      return new Element() { Name = TypeName }; 
     } 

     protected virtual string TypeName 
     { 
      get { return "base"; } 
     } 



    } 

    public class UserA : User 
    { 
     protected override string TypeName 
     { 
      get { return "A"; } 
     } 
    } 

    public class UserB : User 
    { 
     protected override string TypeName 
     { 
      get { return "B"; } 
     } 
    } 

    public class UserC : User 
    { 
     protected override string TypeName 
     { 
      get { return "C"; } 
     } 
    } 
} 

創建您的服務項目中,添加引用您在步驟中創建的類庫1

使用ClassLibrary1的

;

namespace WcfServiceLibrary3 
{ 
    public class Service1 : IService1 
    { 
     public Element GetElement(User type) 
     { 
      if (type == null) return null; 

      return type.GetElement(); 
     } 
    } 
} 

和配置文件

... 
      <endpoint address="" binding="basicHttpBinding" contract="ClassLibrary1.IService1"> 
... 

創建測試控制檯應用程序並寫入以下

using ClassLibrary1; 
using ConsoleApplication10.ServiceReference1; 

namespace ConsoleApplication10 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var myService = new Service1Client(); 

      Console.WriteLine(myService.GetElement(new UserA()).Name); 
      Console.WriteLine(myService.GetElement(new UserB()).Name); 
      Console.WriteLine(myService.GetElement(new UserC()).Name); 
     } 
    } 
} 

的輸出將是

  • Ç