Пользовательская сериализация через AppDomain
Короткая версия: я пытаюсь настроить сериализацию через границу AppDomain, особенно для обработки случаев, когда каждая сторона AppDomain имеет немного различную версию класса. Как мне это сделать?
Длинная версия: мы используем домены приложений для управления различными подмодулями под большим приложением. Мы хотим развернуть эти подмодули независимо друг от друга, поэтому мы используем AppDomains. У нас есть общие контракты dll между основным приложением и подмодулями, различные версии контрактов dll могут оказаться в различных подмодулях, так как каждый обновляется реже, чем основное приложение. В результате иногда новое поле или новый тип добавляются в dll контрактов и используются в основном приложении, но подмодуль не знает, как его сериализовать.
Я думаю, что могу решить эту проблему, настроив процесс сериализации, в частности SerializationBinder.BindToType. Однако для этого мне нужно указать каждой стороне AppDomain использовать этот механизм связывания. Как мне это сделать? Все примеры, которые я видел в Интернете, имеют явные вызовы Serialize() и Deserialize(). Мой код для инициализации AppDomain:
var appDomainSetup = new AppDomainSetup
{
ApplicationBase = config.BasePath,
ShadowCopyFiles = "true",
ConfigurationFile = File.Exists(configPath) ? configPath : null,
};
AppDomain.CreateDomain("myappdomain", null, appDomainSetup);
Спасибо за помощь в этом.
1 ответ
Есть рамки для именно того, что вы хотите сделать. Он находится в библиотеке базовых классов, он называется MAF (Managed AddIn Framework), и вы можете использовать его, ссылаясь на System.AddIn.dll
,
MAF состоит из трех понятий:
- Трубопровод
- открытие
- активация
Вы определяете конвейер AddIn путем создания нескольких интерфейсов и реализации адаптеров между ними. Это утомительный процесс, но он позволяет вам выполнять управление версиями интерфейсов как на стороне входа, так и на стороне хоста. Вы можете использовать старые AddIns на новом хосте, и вы можете использовать новые AddIns в более старой версии хоста, учитывая, что вы развернули соответствующие адаптеры. Весь процесс описан здесь.
Обнаружение позволяет вашему хост-приложению перечислять все надстройки, которые оно находит в ваших настроенных местоположениях, включая метаданные.
Активация затем использует любой AddInToken
найдено на этапе обнаружения для активации надстройки. Вы можете выбрать одну из нескольких моделей изоляции, включая домены приложений, которые должны хорошо подходить для вашего случая использования.
Я использовал фреймворк в разных проектах несколько раз. Если вы привыкли к довольно сложному процессу разработки конвейера и столкнулись с несколькими ловушками (всегда устанавливайте "Копировать локально" на false
для ссылок AddInViews в ваших AddIns), это платит.
Подробное руководство по созданию примера приложения смотрите здесь.