Приложение-клиент/сервер использует WCF для связи, что было замечательно. Однако один недостаток текущей архитектуры заключается в том, что я должен использовать известную конфигурацию типа для определенных передаваемых типов. Я использую внутренний механизм Pub/Sub, и это требование неизбежно.Как настроить программные типы WCF?
Проблема заключается в том, что легко забыть добавить известный тип, и если вы это сделаете, WCF терпит неудачу с небольшим количеством подсказок относительно того, что происходит не так.
В моем приложении я знаю набор типов, которые будут отправлены. Я хотел бы выполнить конфигурацию программно, а не декларативно через App.config
файл, который в настоящее время содержит что-то вроде этого:
<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>
Вместо этого, я хотел бы сделать что-то вроде этого:
foreach (Type type in _transmittedTypes)
{
// How would I write this method?
AddKnownType(typeof(MyParent), type);
}
Может кто-нибудь, пожалуйста, объясните, как я могу это сделать?
EDIT Пожалуйста, поймите, что я пытаюсь установить известные типы динамически во время выполнения, а не декларативно в конфигурации или используя атрибуты в исходном коде.
Это в основном вопрос о API WCF, а не вопрос стиля.
EDIT 2This MSDN page страница состояния:
Вы можете также добавить типы в ReadOnlyCollection, доступ через свойство KnownTypes в DataContractSerializer.
К сожалению, это все, что он говорит, и это не делает очень много смысла, учитывая, что KnownTypes является свойством только для чтения, и значение свойства является ReadOnlyCollection
.
На вашем редактировать 2: Я предполагаю, что они означают, что можно передать в дополнительное известные типы через конструктор DataContractSerializer. Это не поможет в вашем случае, хотя WCF делает свой сериализатор сам. –