MEF, por que duplicatas idênticas de um e mesmo plugin exportado foram criados?
(1) Usando o código abaixo eu recebo exatamente 2 itens em meus contêineres de um único plugin exportado e me pergunto por que:
(2) Pergunta adicional que eu realmente não posso implementar: Como posso estender a estrutura para lidar com diferentes tipos de plug-in (como ter várias importações de diferentes tipos ou uma importação que armazena todos os plug-ins em um IEnumerable dinâmico ou mais). Eu quero fornecer na minha classe wrapper estática um método genérico que retorna o plugin descoberto como uma função do tipo e meta-dados correspondentes.
O plugin exportado (que reside em uma dll separada e cuja localização é apontada quando oDirectoryCatalog
É construído.
[Export(typeof(IPlugin))] //<---- If this line is commented out then only one item is imported (why?)
[PluginAttribute(typeof(StrategyPlugin_Test1), "StrategyPlugin", "Plugin1")]
public class StrategyPlugin_Test1 : IPlugin
{
public void DoSomething()
{
Console.WriteLine("I do something");
}
}
O código a seguir define os metadados e importações fortemente tipificados, bem como uma classe estática que executa as funções do MEF e deve conter os plug-ins descobertos:
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class PluginAttribute : ExportAttribute
{
public Type PluginType { get; set; }
public string PluginGroupName { get; set; }
public string PluginName { get; set; }
public PluginAttribute(Type pluginType, string pluginGroupName, string pluginName) : base(typeof(IPlugin))
{
PluginType = pluginType;
PluginGroupName = pluginGroupName;
PluginName = pluginName;
}
}
public interface IPluginAttribute
{
Type PluginType { get; }
string PluginGroupName { get; }
string PluginName { get; }
}
public interface IPlugin
{
void DoSomething();
}
public class PluginDefinition
{
[ImportMany(typeof(IPlugin))]
public IEnumerable<Lazy<IPlugin, IPluginAttribute>> Plugins { get; set; }
public PluginDefinition()
{
}
}
Aqui a classe estática que envolve algumas das principais coisas do MEF:
public static class PluginManager
{
private static PluginDefinition PluginDefinitions { get; set; }
static PluginManager()
{}
public static void Configure(PluginDefinition pluginDefinitions, IEnumerable<string> pluginDirectories)
{
AggregateCatalog aggregateCatalog = new AggregateCatalog(new DirectoryCatalog(pluginDirectories.FirstOrDefault()));
CompositionContainer container = new CompositionContainer(aggregateCatalog);
container.ComposeParts(pluginDefinitions);
//store plugin definition
PluginDefinitions = pluginDefinitions;
}
public static T GetPlugin<T>(string pluginName, string pluginGroupName) where T : class
{
//how to implement this given type of T could be any of the plugin types ...
//...provided for in an extended PluginDefinition class?
return null;
}
}