Обновление каталога MEF во время выполнения - PullRequest
0 голосов
/ 18 февраля 2012

В настоящее время я работаю над веб-приложением MVC с MEF, чтобы а) разработчики могли разрабатывать плагины для веб-сайта, а пользователи могли выбирать, какие плагины они хотят использовать в своей учетной записи.Это означает, что некоторые мои композиции должны произойти после того, как приложение уже запущено и пользователь вошел в систему (который попадает в базу данных, берет сборки для плагина и добавляет их в текущий каталог).

Как это работает, у меня есть несколько библиотек, которые я сохраняю в базе данных и извлекаю, когда пользователь входит в систему, чтобы загрузить в AssemblyCatalog, который я могу успешно добавить к своему существующему AggregateCatalog в моем Composer.Однако в одной из моих библиотек у меня есть IController контракт, который не экспортируется, что приводит к разрыву этого конкретного виджета.Я не совсем уверен, как заставить MEF перекомпоноваться после запуска.Я пишу здесь, надеясь, что кто-то даст мне какой-нибудь совет.

Мой код основан на превосходной серии блогов Мэтта Эббота , так что я надеюсь, что онЯ также поделюсь с вами некоторыми советами.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012

Ну, вы не могли бы просто загрузить ВСЕ доступные части (независимо от того, на каких клиентах они включены), но использовать отложенное создание экземпляров, либо через Lazy или ExportFactory с комбинацией метаданных, чтобы идентифицировать детали для вашего клиентасистема?Таким образом, вам не нужно загружать сборки по требованию, они просто готовы к работе.

Если вы хотите динамически считывать сборку из базы данных и загружать ее в AppDomain,вы, вероятно, можете обернуть его в новую AssemblyCatalog, но воспользуйтесь преимуществом перекомпоновки.

Например, в этой ранней версии я использовал PartCreator<T,TMetadata>, которая превратилась в ExportFactory<T,TMetadata> близится к выпуску (но не включенав финале .NET 4.0).Если вы измените [ImportMany] на [ImportMany(AllowRecomposition = true)], в следующий раз вы добавите новый каталог, например:

((AggregateCatalog)container.Catalog).Catalogs.Add(<assembly>);

, который должен изменить набор [ImportMany] из PartCreator (ExportFactory) экземпляров.

Не уверен, что это сработает ... Мне нужно понять вашу предполагаемую архитектуру, прежде чем я смогу сказать, сработает или не сработает ...

0 голосов
/ 29 февраля 2012

Я ввожу это как ответ, хотя на самом деле это не ответ, а скорее вывод. Моя проблема заключалась в следующем: я выполнял всю свою композицию MEF при запуске приложения, а затем пытался разделить ее по пользователям после того, как они вошли в систему.

На самом деле, мне просто нужно отложить все это. Пусть сначала пользователь войдет в систему, затем сделает всю мою композицию MEF на основе того, что пользователь «установил» (извлечение сборок из базы данных и т. Д.), Сохранит этот контейнер композиции в сеансе или в каком-либо другом механизме хранения (чтобы я мог получить экспорт по мере необходимости, чтобы построить страницы, виджеты и т. д.), и я золотой. Моя первоначальная проблема возникла из-за попытки вставить квадратный колышек в круглое отверстие. Моя композиция не должна происходить до входа в систему, а не при запуске. Хотя я мог бы использовать MEF для создания некоторого DI в моем приложении, но это было бы отдельно от пользовательской композиции.

Однако я воспользуюсь этим моментом, чтобы еще раз поблагодарить Мэтью Эбботта за его великолепную серию статей о MEF и MVC, которая действительно помогла продвинуть это приложение. :) Я не пометил его ответ как ответ, но проголосовал за него, чтобы повысить репутацию.

...