Мое клиент-серверное приложение использует WCF для связи, что было здорово. Однако одним недостатком текущей архитектуры является то, что я должен использовать конфигурацию известного типа для определенных передаваемых типов. Я использую внутренний механизм Pub / Sub, и это требование неизбежно.
Проблема в том, что легко забыть добавить известный тип, и если вы это сделаете, 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);
}
Может кто-нибудь объяснить, как я могу это сделать?
РЕДАКТИРОВАТЬ Пожалуйста, поймите, что я пытаюсь установить известные типы динамически во время выполнения, а не декларативно в конфигурации или используя атрибуты в исходном коде.
Это в основном вопрос об API WCF, а не вопрос стиля.
РЕДАКТИРОВАТЬ 2 Эта страница MSDN Страница состояния:
Вы также можете добавить типы в коллекцию ReadOnlyCollection, доступ к которой осуществляется через свойство KnownTypes объекта DataContractSerializer.
К сожалению, это все, что он говорит, и это не имеет особого смысла, учитывая, что KnownTypes является свойством только для чтения, а значение свойства - ReadOnlyCollection
.