2009-03-12 12 views
0

Ich versuche, ein Objekt in einen WCF-Webdienst zu übergeben, das Objekt, das ich übergebe, ist ein Server-Objekt, ich möchte dann TestConnection() aufrufen können;WCF und Objekt

Das Problem, das ich habe ist, dass Server die Basisklasse und es gibt mehrere abgeleitete Klassen von Server, dh SqlServer2005Server, OracleServer und ODBCServer, die ich

ich in der Lage sein wollen, in einem Server verwendet werden soll passieren Objekt und dann seinen Typ zu bestimmen, es gegossen und dann die Methode

public string TestServerConnection(Server server) 
{ 
    if (server.ConnectionType == "SqlServer") 
    { 
     SqlServer2005Server x = (SqlServer2005Server)server; 
     // Tests connection to server and returns result 
     return x.TestConnection(); 
    } 

    return ""; 
} 

‚Server‘ die Basisklasse implementiert IServer

ich bin nicht in der Lage, es zu werfen, können Sie raten?

Much Geschätzt

Phill

Antwort

1

Sie müssen die Knowntype Erklärung zu Ihrem Servicevertrag für jede abgeleitete Klasse hinzuzufügen. Es gibt Möglichkeiten, dies zu automatisieren (da es offensichtlich Code verdreht und Vererbung bricht), aber sie erfordern viel Arbeit.

1

Stellt das Objekt, das Sie übergeben, eine "Live" -Verbindung zu einem DBMS dar? Wenn die Antwort ja ist, gibt es keine Hoffnung, dass dies jemals funktioniert. Denken Sie daran, dass trotz des hübschen Wrappers der einzige Teil, den Ihr Webdienst vom Aufrufer erhält, ein Stück XML ist.

2

Wie Daniel Pratt said, am Ende, Sie nur XML (nicht immer der Fall, aber die meiste Zeit Sie sind) nur über den Draht shuttling.

Wenn Sie einen Proxy-Generator zum Generieren der Definition des Servertyps verwendet haben, können Sie die Methoden von Server nicht aufrufen, weil nur Eigenschaften (zumindest semantisch) im Proxy verwendet werden Definition. Außerdem können Sie nicht in abgeleitete Typen umwandeln, da Ihre Instanz in Wirklichkeit eine separate Typdefinition ist und nicht die tatsächliche Basis.

Wenn der Server-Typ ist in der Tat die gleiche Art (und durch gleiche, meine ich einen Verweis auf derselben Baugruppe, nicht nur im Namen und Schema nur), dann können Sie, etwas Steve said tun und das Knowntype Attribut auf dem Server verwenden Definition, Hinzufügen eines Attributs für jede abgeleitete Klasse.

Allerdings, wie er schon sagte, das faltet Ihren Code, also seien Sie vorsichtig, wenn Sie dies tun.

Ich dachte, dass die Verwendung der Inversion der Kontrolle hier funktionieren würde, aber Sie stoßen in der gleichen Situation mit generischen Verweisen auf bestimmte Anbieter.