2016-09-23 1 views
1

Ich habe Hierarchie Dienstklassen wie folgt aus:Wie erstelle ich einen Verweis auf die Basis-Service-Methoden?

Basis Service:

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

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

Dienst A:

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

public class ServiceA : ServiceBase, IServiceA 
{} 

Dienst B:

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

public class ServiceB : ServiceBase, IServiceB 
{} 

Auf der Client-Seite I erstellen zwei Proxy-Klassen für ServiceA und ServiceB durch Visual Studio's "A dd Service reference“Tool:

ProxyA proxyServiceA; 
ProxyB proxyServiceB; 

Diese sind Verweise auf zwei verschiedene Dienste (wenn auch mit einer Basisklasse auf der Serverseite).

Ich möchte Methoden aus dem BaseService über diese Proxies auf identische Weise aufrufen. Zum Beispiel möchte ich diese Proxies als Parameter an eine Methode zu übergeben und seine BaseService Methode aufrufen, wie folgt aus:

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

Aber wie es zu tun, welche Art von Parameter verwenden (denken Sie daran, dass diese Proxies verschiedenen Klassen sind ohne BaseService gemeinsamen Vorfahren)?

Mit anderen Worten, auf der Serverseite ist bekannt, dass ServiceA und ServiceB einen gemeinsamen Vorfahren haben und es möglich ist, eine Basismethode aufzurufen, aber wie geht das auf der Client-Seite?

Ist es möglich, eine Klasse auf dem Client zu erhalten, die als Basisklasse für diese beiden Proxies erkannt wird? (außer System.ServiceModel.ClientBase natürlich)

+0

Das Problem ist fast die gleiche wie in [diesem Fall] (http://stackoverflow.com/questions/3422567/wcf-service-vererbung) - Erstellen eines Basis-Proxys, der den Basisdienst implementiert. – Alex34758

Antwort

0

Sie müssen ServiceKnownTypeAttribute Klasse verwenden. Mit dem Attribut KnownType können Sie akzeptable Unterklassen für den Datenvertrag (Ihren Basisdienst) festlegen. Dieses Beispiel zeigt, wie es verwendet wird. Whithout KnowType werden Sie immer Ausnahme wie

Communication erhalten wurde unhandled

[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

Ich fügte mehr Klarheit zu meiner Frage mit Codebeispielen hinzu. Ich denke, die bekannten Typen sind nicht der Schlüssel oder nur ein Teil des Schlüssels. Ich verstehe den Teil meines Codes nicht, in dem ich WorkMethod aufrufen muss - wie kann ich einen dieser Proxies (proxyServiceA oder proxyServiceB) an die WorkMethod-Methode übergeben und BaseMethod aufrufen? Die bekannten Typen sind nicht genug, denke ich. – Alex34758

+0

Das Konzept bekannter Typen bezieht sich auf Datenverträge. In meiner Frage gibt es keine Datenverträge. Meine Frage besteht darin, die Basisimplementierung der Basisschnittstelle zu teilen und zu versuchen, diese Basisfunktionalität auf dem Client zu verwenden. Entschuldigung, ich denke deine Antwort ist nicht relativ. – Alex34758

Verwandte Themen