gpt4 book ai didi

c# - MEF,为什么创建了一个相同的导出插件的相同副本?

转载 作者:太空狗 更新时间:2023-10-30 01:21:11 25 4
gpt4 key购买 nike

(1) 使用下面的代码,我在同一个导出插件的容器中得到了 2 个项目,我想知道为什么:

(2) 我确实无法实现的其他问题:如何扩展框架以处理不同的插件类型(例如具有多个不同类型的导入,或者一个将所有插件存储在动态 IEnumerable 中的导入)。我想在我的静态包装器类中提供一个通用方法,该方法将发现的插件作为类型和匹配元数据的函数返回。

导出的插件(驻留在单独的 dll 中,其位置在构建 DirectoryCatalog 时指向。

[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");
}
}

以下代码定义了强类型元数据和导入,以及执行 MEF 函数并应该包含已发现插件的静态类:

[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()
{

}
}

这里是包装一些核心 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;
}

}

最佳答案

重复导出背后的原因是您从 ExportAttribute 派生自定义导出元数据属性这一事实.这意味着当你用 PluginAttribute 修饰类成员时, 您不需要添加 ExportAttribute . MEF 将查找可分配给 ExportAttribute 的属性它会在你的 PluginAttribute 中找到一个.

关于插件类型的另一个问题,MEF 允许对同一类型进行多次导出。您可以拥有一个 IPlugin 类型的导出和另一个更专业的导出,就像您在代码中所做的那样:

[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

然后对每个导出类型进行不同的导入。你可以有一个 IEnumerable<IPlugin> import 然后在另一个属性上 a StrategyPlugin_Test1导入。

关于c# - MEF,为什么创建了一个相同的导出插件的相同副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16415192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com