Plugins 是MEF';s ComposableParts契约基于实例?

Plugins 是MEF';s ComposableParts契约基于实例?,plugins,inversion-of-control,mef,Plugins,Inversion Of Control,Mef,我真的不知道如何表达我的问题的标题,所以我提前道歉。我通读了MEF文档的部分内容,试图找到问题的答案,但找不到 我使用ImportMany允许MEF创建特定插件的多个实例。该插件导入几个部分,在对特定实例的调用中,它希望这些导入是单例的。然而,我不希望这个插件的所有实例都使用相同的单例 例如,假设我的应用程序ImportManys Blender appliances。每次我要一个,我都要一个不同的搅拌机。但是,每个搅拌机Imports都是一个控制面板。我希望每个搅拌机都有自己的控制面板。为了让

我真的不知道如何表达我的问题的标题,所以我提前道歉。我通读了MEF文档的部分内容,试图找到问题的答案,但找不到

我使用ImportMany允许MEF创建特定插件的多个实例。该插件导入几个部分,在对特定实例的调用中,它希望这些导入是单例的。然而,我不希望这个插件的所有实例都使用相同的单例

例如,假设我的应用程序
ImportMany
s Blender appliances。每次我要一个,我都要一个不同的搅拌机。但是,每个搅拌机
Import
s都是一个控制面板。我希望每个搅拌机都有自己的控制面板。为了让事情变得更有趣,每个搅拌机都可以加载blendprogram,它们也包含在自己的程序集中,MEF负责加载。BlendProgram可能需要访问控制面板才能获得速度,但我想确保它访问的是正确的控制面板(即与程序关联的搅拌机关联的控制面板!)

这个图表可能会让事情变得更清楚一些:

正如注释所显示的,我相信这种混乱可能来自于一个固有的糟糕设计。BlendProgram不应该直接接触控制面板,相反,BlendProgram应该通过Blender获得速度,然后Blender将请求委托给其控制面板

如果是这种情况,那么我假设BlendProgram需要引用特定的搅拌机。为了做到这一点,利用MEF并为BlendProgram使用ImportingConstructor的正确方法是什么

[导入构造函数] 公共类BlendProgram:IBlendProgram { 公共搅拌机程序(搅拌机搅拌机){} }


如果是这样的话,我怎么知道MEF会使用预期的Blender插件呢?

你应该按照前面提到的那样破坏它。如你所说,通过你的搅拌机暴露你的控制面板。如果您确实想保留当前的设计,则必须使用元数据装饰导入,并创建一个自定义导出提供程序,该提供程序将使用此元数据来确定应该使用的导出。如果你能摆脱这个额外的步骤,那就去做。

你应该像前面提到的那样打破它。如你所说,通过你的搅拌机暴露你的控制面板。如果您确实想保留当前的设计,则必须使用元数据装饰导入,并创建一个自定义导出提供程序,该提供程序将使用此元数据来确定应该使用的导出。如果你能摆脱这个额外的步骤,那就去做。

我想我必须打破这种联系,因为这似乎是正确的做法,但我的另一个问题仍然是——如何确保BlendProgram与正确的Blender相关联?由于MEF控制两个实例的解析,它是否会自动将正确的实例传递给导入构造函数,因为我希望它“只知道”某个特定的Blender想要解析该Blender程序?我想我必须打破这种关联,因为这似乎是正确的方法,但我的另一个问题仍然存在——如何确保BlendProgram与正确的搅拌机相关联?由于MEF控制两个实例的解析,它是否会自动将正确的实例传递给导入构造函数,因为我希望它“只知道”某个特定的Blender想要解析该Blender程序?