Как поддерживать двойные версии интерфейса в MEF? - PullRequest
2 голосов
/ 26 августа 2011

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

Чтобы упростить совместимость и развертывание, мы договоримся о двух наборах интерфейсов: v (последний) и v (последний-1).Так или иначе, каждый хост должен поддерживать оба набора.

В идеале, я хотел бы написать хост, предназначенный только для последней версии v (последней), и прозрачно адаптировать старые компоненты с помощью некоторого пользовательского кода адаптераv (последний) разработчик контракта будет нести ответственность за.

Host importing v(Latest) -> Adapter -> Plugin export v(Latest-1)

Есть ли способ, которым я могу добиться этого в MEF?Я еще не слишком знаком с его моделью расширяемости, я никогда не использовал ее раньше.

1 Ответ

1 голос
/ 26 августа 2011

Вместо того, чтобы делать ImportMany из всех плагинов, вы можете просто импортировать IPluginProvider. Затем вы можете поместить необходимую логику адаптера в реализацию поставщика плагинов. Например:

[Export(typeof(IPluginProvider))]
public PluginProvider : IPluginProvider
{
   [ImportMany]
   public IEnumerable<IPlugin2> Plugins { get; set; }

   [ImportMany]
   public IEnumerable<IPlugin1> LegacyPlugins { get; set; }

   public IEnumerable<IPlugin2> GetPlugins()
   {
      var adaptedPlugins = this.LegacyPlugins.Select(x => new Adapter(x));
      return this.Plugins.Concat(adaptedPlugins);
   }
}

Эта опция работает, только если у вас есть контроль над потребителями плагинов, так что вы можете изменить их на импорт IPluginProvider. Если нет, вам нужно настроить контейнер MEF с реализацией ExportProvider, которая каким-то образом осведомлена об адаптерах.

MEF не поставляется с чем-то подобным из коробки, поэтому я развернул свой экспериментальный ExportManyProvider . Это позволяет вам экспортировать сервисы адаптера, подобные приведенным выше, с атрибутом ExportMany. См. Тестовый код для примера того, как его использовать.

...