Я реализовал что-то в этом духе, используя Managed Addin Framework (MAF) в пространстве имен System.Addin. С MAF вы упаковываете свои надстройки как отдельные библиотеки DLL, которые ваше хост-приложение может обнаружить и запустить в своем домене приложений, в отдельном домене для всех надстроек или в каждом надстройке в своем собственном домене. С помощью теневого копирования и отдельных доменов вы даже можете обновить надстройку, не закрывая хоста.
Ваше хост-приложение и надстройки взаимодействуют через контракты, которые вы выводите из интерфейсов MAF. Вы можете отправлять объекты назад и вперед между хостом и надстройками. Cotnracts предоставляют интерфейс черного ящика между надстройками и хостом, позволяя вам изменять реализацию аддина без ведома хоста.
Надстройки могут даже общаться между собой, если хост рассказывает им друг о друге. В моем случае надстройка для ведения журналов используется другими пользователями. Это позволяет мне подключать разные логгеры, не касаясь других надстроек или хоста.
Для моего приложения надстройка использует простые супервизорные классы, которые при запуске рабочих классов в своих собственных потоках выполняют всю обработку. Рабочие ловят свои собственные исключения, которые они возвращают своему супервизору через методы обратного вызова. Супервайзеры могут перезапустить работников или принять другие меры. Хост контролирует супервизоров через командный контракт, который инструктирует их запускать и останавливать работников и возвращать данные.
Моим хост-приложением является служба Windows. Рабочие потоки выдавали исключения по всем обычным причинам (включая ошибки!), Но приложение хоста никогда не падало ни в одной из наших установок. Поскольку сервисы отладки неудобны, надстройки позволяют мне создавать тестовые приложения, использующие те же контракты, с дополнительной уверенностью, что я тестирую то, что развертываю.
Надстройки также могут предоставлять элементы пользовательского интерфейса. Это очень полезно для меня, так как мне нужно развернуть приложение контроллера с хост-сервисом, поскольку сервисы не имеют пользовательского интерфейса. Каждый плагин имеет свой собственный интерфейс контроллера. Само приложение контроллера очень просто - оно загружает надстройки и отображает их элементы пользовательского интерфейса. Это позволяет мне отправлять обновленный надстройку с обновленным интерфейсом и не нужно отправлять новый контроллер.
Несмотря на то, что контроллер и служба хоста используют одни и те же надстройки, они не наступают друг на друга; на самом деле, они даже не знают, что другое приложение использует те же надстройки. Контроллер и хост общаются друг с другом через общую базу данных, но вы также можете использовать другой механизм между приложениями, такой как MSMQ. В следующей версии хост будет службой WCF с надстройками на сервере и веб-службами для управления.
Это немного скучно, но я хотел дать вам представление о том, насколько универсален MAF. Это не так сложно, как может показаться на первый взгляд, и с его помощью можно создавать надежные приложения.