Mon application client/serveur utilise WCF pour la communication, ce qui a été génial. Cependant, un défaut de l'architecture actuelle est que je dois utiliser une configuration de type connue pour certains types transmis. J'utilise un mécanisme Pub/Sub interne et cette exigence est inévitable. Le problème est qu'il est facile d'oublier d'ajouter le type connu, et si vous le faites, WCF échoue silencieusement avec peu d'indices sur ce qui ne va pas.Comment configurer les types connus WCF par programme?
Dans mon application, je connais l'ensemble des types qui vont être envoyés. Je voudrais effectuer la configuration par programme, plutôt que déclarative dans le fichier App.config
qui contient actuellement quelque chose comme ceci:
<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>
Au lieu de cela, je voudrais faire quelque chose comme ceci:
foreach (Type type in _transmittedTypes)
{
// How would I write this method?
AddKnownType(typeof(MyParent), type);
}
Can quelqu'un s'il vous plaît expliquer comment je pourrais le faire?
EDIT Veuillez comprendre que j'essaie de définir les types connus dynamiquement au moment de l'exécution plutôt que de manière déclarative dans config ou en utilisant des attributs dans le code source.
Il s'agit essentiellement d'une question sur l'API WCF, pas une question de style.
EDIT 2This MSDN page états de page:
Vous pouvez également ajouter des types à la ReadOnlyCollection, accessible par la propriété KnownTypes du DataContractSerializer.
Malheureusement, c'est tout ce qu'il dit et il n'a pas de sens terriblement bien étant donné que KnownTypes est une propriété en lecture seule, et la valeur de la propriété est un ReadOnlyCollection
.
Sur votre édition 2: Je suppose qu'ils veulent dire que vous pouvez passer supplémentaire types connus par le constructeur DataContractSerializer. Cela ne vous aidera pas beaucoup dans votre cas, car WCF fait lui-même son sérialiseur. –