Die Lösung für ein Problem bin ich noch schuldig geblieben. Die beim letzten mal vorgestellte Lösung hatte den Nachteil, dass ein wichtiges Prinzip der Serviceorientierung nicht eingehalten wurde - Services share schema and contract, not class.
Die Lösung hierfür ist es die möglichen ServiceKnownTypes erst zur Laufzeit zu bestimmen. Folgendes Beispiel erläutert, wie es funktioniert:
-
[ServiceContract]
-
public interface ICustomerService
-
{
-
[OperationContract]
-
void AddCustomerInterface(ICustomer customer);
-
-
[OperationContract]
-
void AddCustomerBase(CustomerBase customer);
-
}
-
-
public static class KnownTypeHelper
-
{
-
public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
-
{
-
return knownTypes;
-
}
-
}
Die Klasse KnownTypeHelper stellt durch die Funktion GetKnownTypes die Typen für den Service bereit, die bei der Serialisierung und Deserialisierung genutzt werden sollen. Zu beachten ist das geänderte ServiceKnownType-Attribut am Interface ICustomerService.
Mit diesem Ansatz wird sowohl Polymorphismus unterstützt und gleichzeitig die Prinzipien der Serviceorientierung eingehalten.
Anmerkung: Es sollte offensichtlich sein, dass in der Methode GetKnownTypes die Typen dynamsich bestimmt werden können. So wäre es denkbar diese aus einer Konfiguration zu laden und/oder per Reflection zu bestimmen.
[...] Aber keine Sorge, auch für dieses Problem gibt es eine Lösung in Teil 3. [...]