Gestern habe ich im ersten Teil ein Problem geschildert, das auftritt, wenn man versucht Polymorphismus im Zusammenhang mit WCF-Services einzusetzen. Dabei ging es konkret darum Interfaces oder abstrakte Klassen als Parameter an Service-Methoden zu übergeben.
Die vorgestellte Lösung für das Problem mittels des ServiceKnownType-Attributs hatte den Nachteil, dass "echter" Polymorphismus nicht unterstützt wurde und somit ein weiteres Problem geschaffen war bzw. das eigentlich Problem nicht richtig gelöst war.
Um in unserem Beispiel "echten" Polymorphismus zu unterstützen, muss es möglich sein, beliebige Instanzen von Klassen an den Service zu übermitteln, die entweder das Interface ICustomer implementieren oder von der abstrakten Klasse CustomerBase abgeleitet sind. Möglich ist dies durch den Einsatz des NetDataContractSerializers. Wie das im Detail funktioniert beschreibt Aaron Skonnard in seinem Blogeintrag WCF's NetDataContractSerializer.
Mit Hilfe des dort vorgestellten NetDataContractFormat-Attributs sieht die Beschreibung unseres Service somit folgendermaßen aus:
C#:
-
[ServiceContract]
-
public interface ICustomerService
-
{
-
[OperationContract]
-
[NetDataContractFormat]
-
void AddCustomerInterface(ICustomer customer);
-
-
[OperationContract]
-
[NetDataContractFormat]
-
void AddCustomerBase(CustomerBase customer);
-
}
OK, alles ist super. Polymorphismus wird unterstützt und wir sind glücklich.
Naja, leider nicht wirklich ...
Read the rest of this entry »