Wie konfigurieren Sie WCF-Typen programmgesteuert?
Meine client - /server-Anwendung mit WCF für die Kommunikation, die war großartig. Jedoch ein Manko der aktuellen Architektur ist, dass ich verwenden muss, bekannt geben Sie die Konfiguration für bestimmte Arten übertragen. Ich bin mit einem in-house Pub/Sub-Mechanismus, und diese Anforderung ist unumgänglich.
Das problem ist, dass es leicht zu vergessen, hinzuzufügen, die bekannt geben, und wenn Sie das tun, WCF schlägt im hintergrund fehl, mit einige Hinweise darauf, was falsch läuft.
In meiner Anwendung, ich kenne den Typen, die gesendet werden. Ich möchte, um die Konfiguration programmatisch, eher als deklarativ über die App.config
- Datei, die enthält derzeit so etwas wie dieses:
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="MyProject.MyParent, MyProjectAssembly">
<knownType type="MyProject.MyChild1, MyProjectAssembly"/>
<knownType type="MyProject.MyChild2, MyProjectAssembly"/>
<knownType type="MyProject.MyChild3, MyProjectAssembly"/>
<knownType type="MyProject.MyChild4, MyProjectAssembly"/>
<knownType type="MyProject.MyChild5, MyProjectAssembly"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
Stattdessen würde ich gerne etwas wie das hier tun:
foreach (Type type in _transmittedTypes)
{
//How would I write this method?
AddKnownType(typeof(MyParent), type);
}
Kann mir bitte jemand erklären, wie ich das tun kann?
BEARBEITEN Bitte haben Sie Verständnis, dass ich versuche mit den bekannten Typen dynamisch zur Laufzeit und nicht als deklarativ in der Konfiguration oder die Verwendung von Attributen im Quellcode.
Dies ist im Grunde eine Frage, über die WCF-API, nicht auf eine Stil-Frage.
EDIT 2 Dieser MSDN-Seite Seite besagt:
Können Sie auch Arten, die ReadOnlyCollection, aufgerufen durch die KnownTypes Eigenschaft des DataContractSerializer.
Leider das ist alles was es sagt, und es macht nicht furchtbar viel Sinn gegeben, dass KnownTypes ist eine readonly-Eigenschaft und der Wert der Eigenschaft ist ein ReadOnlyCollection
.
InformationsquelleAutor der Frage Drew Noakes | 2009-04-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen
[ServiceKnownType]
zu Ihrem[ServiceContract]
Schnittstelle:dann erstellen Sie eine Klasse namens
KnownTypesProvider
:und dann übergeben Sie zurück, was auch immer Typen, die Sie brauchen.
InformationsquelleAutor der Antwort Miki Watts
Es gibt 2 weitere Wege, um Ihr problem zu lösen:
I. Verwenden KnownTypeAttribute(string):
II. Verwendung Konstruktor DataContractSerializer
HINWEIS: verwenden Sie dieses Attribut auf beiden Seiten: der client-Seite und die service-Seite!
InformationsquelleAutor der Antwort Sergey Teplyakov
Ich brauchte, um dies zu tun, um die Vererbung zulassen, richtig zu arbeiten. Ich wollte nicht zu haben, Sie zu pflegen die Liste der abgeleiteten Typen.
Ich weiß die erste Zeile der Funktion ist übertrieben, aber es bedeutet nur, ich kann fügen Sie es in einem Basis-Klasse ohne änderung.
InformationsquelleAutor der Antwort Paul McNamara
Web .Config
Die Reihenfolge ist die abstrakte Basisklasse
InformationsquelleAutor der Antwort Amit Bagga
etwas übertrieben, aber funktioniert und ist eine Art der zukunftssicheren
InformationsquelleAutor der Antwort aeroson