我真的不知道怎么说出我的问题的标题,所以我提前道歉。我阅读了MEF文档的部分内容,试图找到我的问题的答案,但找不到它。
我正在使用ImportMany来允许MEF创建特定插件的多个实例。该插件导入了几个部分,并且在对特定实例的调用中,它希望这些Imports是单例。但是,我不想要的是这个插件的所有实例都使用相同的单例。
例如,假设我的应用程序ImportMany
是Blender设备。每次我要求一个,我想要一个不同的搅拌机。但是,每个Blender Import
都是一个ControlPanel。我希望每个Blender都有自己的ControlPanel。为了使事情变得更有趣,每个Blender都可以加载BlendPrograms,它们也包含在它们自己的程序集中,MEF负责这个加载。 BlendProgram可能需要访问ControlPanel以获得速度,但我想确保它正在访问正确的ControlPanel(即与该程序关联的Blender关联的那个!)
这个图表可能会略微清楚:
正如笔记所示,我认为混淆可能来自于本身就很差的设计。 BlendProgram不应该直接触摸ControlPanel,而是BlendProgram可能会通过Blender获取速度,Blender会将请求委托给它的ControlPanel。
如果是这种情况,那么我假设BlendProgram需要引用特定的Blender。为了做到这一点,是利用MEF并使用ImportingConstructor进行BlendProgram的正确方法,即
[ImportingConstructor] 公共类BlendProgram:IBlendProgram { public BlendProgram(Blender blender){} }
如果是这种情况,我怎么知道MEF会使用预期的Blender插件?
答案 0 :(得分:1)
你应该如上所述打破它。如你所说,通过搅拌机展示控制面板。如果您真的想要保留当前的设计,则必须使用元数据修饰导入,并创建一个自定义导出提供程序,该提供程序将使用此元数据来确定应使用的导出。如果你能摆脱这个额外的步骤,那就去做吧。