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