В моем клиент-серверном приложении для связи используется 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
.