2

Краткая версия: Я пытаюсь настроить сериализацию по интерфейсу AppDomain, в частности, для обработки случаев, когда каждая сторона AppDomain имеет немного отличающуюся версию класса. Как мне это сделать?Пользовательская сериализация через AppDomain

Длинная версия: Мы используем AppDomains для управления различными подмодулями под большим приложением. Мы хотим развернуть эти подмодули независимо, следовательно, использовать 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 состоит из трех понятий:

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

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

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

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

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

Для обширного учебного пособия, создающего образец приложения, look here.

+0

Thanks Frank. Это, скорее всего, является нашим долговременным ответом, и я думаю, что смогу обойти наш текущий вопрос, поскольку на данный момент у нас только 1 подмодуль. –

Смежные вопросы