Mon application client/serveur utilisant WCF pour la communication, qui a été grand. Cependant une lacune de l'architecture actuelle, c'est que je doit utiliser le type de configuration pour certains transmis types. Je suis à l'aide d'un Pub/Sub mécanisme 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 quelques indices quant à ce qui va mal.
Dans mon application, je sais que l'ensemble des types qui vont être envoyés. Je voudrais effectuer la configuration par programmation, plutôt que de façon déclarative par l' App.config
le fichier 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);
}
Quelqu'un peut-il expliquer comment je pourrait le faire?
MODIFIER s'il vous Plaît comprendre que je suis en train de définir les types connus de manière dynamique au moment de l'exécution plutôt que de manière déclarative dans la configuration ou à l'aide d'attributs dans le code source.
C'est fondamentalement une question à propos de la FMC de l'API, pas une question de style.
EDIT 2 Cette page MSDN états de la page:
Vous pouvez également ajouter des types de la ReadOnlyCollection, accessible par le KnownTypes propriété de la DataContractSerializer.
Malheureusement c'est tout ce qu'il dit et il ne fait pas trop, ce sens étant donné que le KnownTypes est une propriété en lecture seule, et la valeur de la propriété est un ReadOnlyCollection
.