Comment configurez-vous WCF types connus par programmation?
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 les App.config
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
.
- Sur votre edit 2: je suppose qu'ils signifient que vous pouvez passer en extra-types connus à travers le DataContractSerializer constructeur. Ce qui n'aidera pas beaucoup dans votre cas, si, comme WCF fait son sérialiseur lui-même.
Vous devez vous connecter pour publier un commentaire.
Ajouter
[ServiceKnownType]
à votre[ServiceContract]
interface:ensuite créer une classe appelée
KnownTypesProvider
:et puis vous pouvez passer à ce que les types dont vous avez besoin.
IEnumerable<Type>
et indiquent que la classe peuvent être internes et encore ok. Merci encore.ICustomAttributeProvider
paramètre fait partie de la signature de la méthode. Vous n'avez pas à utiliser la valeur du paramètre, mais le paramètre doit être présent pour la Réflexion pour trouver la méthode de la classe spécifiée dans leServiceKnownType
attribut. En revanche, la spécification d'un nom de méthode dans laKnownType
attribut implique un vide de la liste des paramètres.Il y a 2 façons de résoudre votre problème:
I. Utilisation de KnownTypeAttribute(string):
II. Utilisez constructeur DataContractSerializer
REMARQUE: Vous devez utiliser cet attribut sur les deux côtés: du côté client et côté service!
J'avais besoin de le faire pour permettre à l'héritage pour fonctionner correctement. Je ne voulais pas avoir à mettre à jour la liste des types dérivés.
Je sais que la première ligne de la fonction est exagéré, mais ça veut dire que je peux les coller dans une autre classe de base sans modification.
Web .Config
L'Ordre est la classe de base abstraite
un peu exagéré, mais il fonctionne et est en quelque sorte de l'avenir de