Пользовательская сериализация в домене приложений

Краткая версия: я пытаюсь настроить сериализацию через границу 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);

Спасибо за помощь в этом вопросе.


person Anthony Frasso    schedule 09.02.2015    source источник


Ответы (1)


Есть рамки именно для того, что вы хотите делать. Он находится в библиотеке базовых классов и называется MAF (Managed AddIn Framework), и вы можете использовать его, указав System.AddIn.dll.

MAF состоит из трех концепций:

  1. Трубопровод
  2. Открытие
  3. Активация

Вы определяете конвейер надстройки, создавая несколько интерфейсов и реализуя между ними адаптеры. Это утомительный процесс, но он позволяет вам управлять версиями интерфейсов как на стороне надстройки, так и на стороне хоста. Вы можете использовать старые надстройки на новом хосте, и вы можете использовать новые надстройки в более старой версии хоста, при условии, что вы развернете соответствующие адаптеры. Весь процесс описан здесь.

Обнаружение позволяет вашему хост-приложению перечислять все надстройки, которые оно находит в настроенных вами местах, включая метаданные.

Активация затем использует любые AddInToken, обнаруженные на этапе обнаружения, для активации надстройки. Вы можете выбирать между несколькими моделями изоляции, включая домены приложений, которые должны хорошо соответствовать вашему варианту использования.

Я несколько раз использовал фреймворк в разных проектах. Если вы привыкнете к довольно сложному процессу разработки конвейера и наткнетесь на несколько ловушек (всегда устанавливайте «Копировать локально» на false для ссылок AddInViews в ваших надстройках), это окупается.

Подробное руководство по созданию образца приложения см. здесь < / а>.

person Frank    schedule 09.02.2015
comment
Спасибо, Фрэнк. Это с большой вероятностью станет нашим долгосрочным ответом, и я думаю, что смогу обойти нашу текущую проблему, поскольку на данный момент у нас есть только 1 подмодуль. - person Anthony Frasso; 09.02.2015