Вместо того, чтобы делать 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
. См. Тестовый код для примера того, как его использовать.