2016-09-23 48 views
1

我有服務類層次結構是這樣的:如何創建對基本服務方法的引用?

基本服務:

[ServiceContract()] 
public interface IServiceBase 
{ 
    [OperationContract] 
    void BaseMethod(); 
} 

public class ServiceBase : IServiceBase 
{ 
    public void BaseMethod() 
    {} 
} 

服務A:

[ServiceContract()] 
public interface IServiceA : IServiceBase 
{} 

public class ServiceA : ServiceBase, IServiceA 
{} 

服務B:

[ServiceContract()] 
public interface IServiceB : IServiceBase 
{} 

public class ServiceB : ServiceBase, IServiceB 
{} 

在客戶端創建通過Visual Studio的「A。ServiceA和ServiceB的兩個代理類DD服務引用」工具:在兩種不同的服務

ProxyA proxyServiceA; 
ProxyB proxyServiceB; 

這些參考文獻(雖然在服務器側上的基類)。

我想打電話給通過相同的方式將這些代理從BaseService方法。例如,我想這些代理作爲參數傳遞給方法,並調用其BaseService方法,像這樣:

// somewhere on the client side 
WorkMethod(proxyServiceA); 
WorkMethod(proxyServiceB); 

// Something like this, BUT I DON'T REALLY KNOW WHAT TYPE OF PARAMETER TO USE 
void WorkMethod(ProxyBase proxyBase) 
{ 
    proxyBase.BaseMethod(); 
} 

但如何做到這一點,使用什麼類型的參數(記住,這些代理屬於不同類別沒有BaseService共同的祖先)?

換句話說,在服務器端已知ServiceA和ServiceB有一個共同的祖先,它是可以調用基方法,但如何做到這一點的客戶端?

是否有可能獲得被識別爲這兩個代理基類客戶端上的一些課?(當然除了System.ServiceModel.ClientBase)

+0

的問題是幾乎相同[此情況下(http://stackoverflow.com/questions/3422567/wcf-service-inheritance) - 創建一個實現基本服務的基本代理。 – Alex34758

回答

0

您需要使用ServiceKnownTypeAttribute類。該KnownType屬性允許您指定的數據合同可接受子類(你的基本服務)。這個例子展示了它如何使用。內部消除KnowType你總是會得到異常喜歡

是的CommunicationException未處理

[DataContract] 
[KnownType(typeof(Student))] 
[KnownType(typeof(Teacher))] 
public abstract class BaseService 
    { 
     [DataMember] 
     public int Code { get; set; } 

     [DataMember] 
     public string Name { get; set; } 
    } 
[DataContract] 
public class Student : BaseService 
    { 
     [DataMember] 
     public int StudentId { get; set; } 
    } 
[DataContract] 
public class Teacher : BaseService 
    { 
     [DataMember] 
     public int TeacherId { get; set; } 
    } 

Here is MSDN doc

+0

我使用代碼示例爲我的問題添加了更多的清晰度。我認爲已知的類型不是關鍵或只是關鍵的一部分。我不明白我的代碼,我要打電話WorkMethod部分 - 我如何可以通過這些代理(proxyServiceA或proxyServiceB)到WorkMethod方法和呼叫BaseMethod?我認爲已知的類型是不夠的。 – Alex34758

+0

已知類型概念與數據合同有關。我的問題中沒有數據合同。我的問題是關於共享基礎接口的基礎實現並嘗試在客戶端上使用這個基礎功能。對不起,我認爲你的答案不是相對的。 – Alex34758

相關問題