2008-09-30 14 views
6

Ich habe eine Bibliothek mit einigen Entitäten, die die gleiche Schnittstelle teilen. Kunden und Service teilen diese Baugruppe. Jetzt frage ich mich, ob es einen Weg gibt, diesen Interface-Typ als Parameter in meinen Service-Verträgen zu haben, so dass ich dieselbe Methode für alle Klassen verwenden kann, die die Schnittstelle implementieren.Wcf und Schnittstellen als Parameter

die Entitäten selbst sind alle mit Datenkontraktattribut und seinen Mitgliedern mit Datenamternattributen versehen.

ist es überhaupt möglich? wahrscheinlich mit dem NetDataContractSerializer? ich weiß, dass ich es mit einer Basisklasse (einige abstrakte Klasse zB) und wonntype -Attribut tun kann, aber ich würde definitiv die Schnittstelle als Identifikator der Objekte bevorzugen, da es weit verbreitet in der Client-App verwendet wird und erleichtern würde Entwicklung.

dank

Antwort

6

Ich löste das Problem mit dem ServiceKnownType-Attribut bei den Implementierungen der OperationContracts.

Wenn Sie Ihren Klassen mitteilen, dass die Schnittstelle als ServiceKnownType implementiert ist, können Sie die Schnittstelle als Parameter verwenden und daher alle Klassen verwenden, die Ihre Schnittstelle implementieren, solange sie serialisierbar sind. (siehe "Programmierung von WCF-Diensten" von Juval Löwy, Seite 100)

1

Es ist sicherlich nicht möglich, unter normalen "mex". Es könnte mit Assembly-Sharing möglich sein, aber ich würde es wirklich nicht empfehlen - Sie kämpfen WCF: es wird spröde, etc. Natürlich können Sie dies immer in Ihrem Objektmodell maskieren - dh, anstatt die [anrufen] OperationContract] direkt abstrahieren und in eine Wrapper-Methode abstrahieren, die die WCF-Details versteckt (möglicherweise mit anderen Objekten für die Datenübertragung, als sie tatsächlich zurückgibt).

0

[Ich habe gerade Ihre Antwort gelesen und festgestellt, dass Sie sich speziell über Parameter zu Service-Methoden erkundigt haben. Ich werde meine Kommentare hier im Fall lassen sie noch nützlich sind]

Was ich an Projekten gemacht habe, wo ich weiß, ich habe WCF auf beiden Seiten des Drahtes ist so etwas wie:.

Eine Bibliothek nur die gemeinsamen Schnittstellen, zB:

namespace SharedInterfaces { 
    public interface ICompositeType { 
     bool BoolValue { get; set; } 
     string StringValue { get; set; } 
    } 
} 

der WCF-Service-Bibliothek, wo die [Datacontract] s (POCOs) die gemeinsamen Schnittstellen implementieren.

[DataContract] 
public class CompositeType : ICompositeType { 
    bool boolValue = true; 
    string stringValue = "Hello "; 

    [DataMember] 
    public bool BoolValue { 
     get { return boolValue; } 
     set { boolValue = value; } 
    } 

    [DataMember] 
    public string StringValue { 
     get { return stringValue; } 
     set { stringValue = value; } 
    } 
} 

Im Service-Client kann jeder Proxy POCO „gezwungen“ werden, um die gemeinsame, entfalten, Schnittstelle eine partielle Klasse mit zu implementieren (es wird auf jeden Fall, wenn svcutil richtig Job ist es tut), und Sie werden in der Lage sein, zu programmieren, um die Schnittstelle in den Rest Ihres Client-Code:

namespace ServiceClient.ServiceReference1 { 
    public partial class CompositeType : ICompositeType { 
    } 
} 

Diese teilweise ist auch nützlich, wenn Sie einige zusätzliche Eigenschaften oder Methoden hinzufügen möchten, dass der Client in Verwendung (zB Presenter oder Ansichtsmodell Konzepte machen. MVP- oder MVVM-Muster).

+0

+1 für Im Service-Client kann jeder Proxy-POCO "gezwungen" werden, die gemeinsam genutzte, implementierte Schnittstelle mit einer partiellen Klasse zu implementieren. –