创建导入的MEF部件的多个实例

Tim*_*hyP 11 .net c# mef

目前我的WPF应用程序导入了这样的部分

[Import(typeof(ILedPanel)]
public ILedPanel Panel { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是这给了ma实现ILedPanel的类的单个intance.我真正想做的是能够创建我需要的尽可能多的实例.请注意,在任何给定时间,软件中只包含一个ILedPanel导出.

(如果我使用带有List的导入,它为每个实现ILedPanel的类提供了一个实例)

有什么建议?

Sco*_*ock 10

我不确定这是否是Nicolas所指的,但您可以导入Factory类而不是实例类,如下所示:

[Import(typeof(ILedPanelFactory)]
public ILedPanelFactory PanelFactory { get; set; }
Run Code Online (Sandbox Code Playgroud)

......然后在你的代码中......

ILedPanel panel = PanelFactory.BuildPanel();
Run Code Online (Sandbox Code Playgroud)


小智 9

今天在MEF中没有"内置"支持,但在恢复服务定位器之前,您可能会在这里找到一些灵感:http://blogs.msdn.com/nblumhardt/archive/2008/12/27/container -managed-应用设计前奏-其中此结果的容器-belong.aspx

基本思想是将容器"导入"需要进行动态实例化的组件.

我们正在探索对这种情况的更直接支持.

缺口

更新: MEF现在有实验支持.有关更多信息,请参阅此博客文章.


Adi*_*ter 9

所有其他答案都很老,所以他们没有提到MEF中一个相对较新的功能ExportFactory.这个泛型类允许您随时根据需要导入ExportFactory<ILedPanel>和创建任意数量的实例,因此您的代码将如下所示:

[Import(typeof(ILedPanel)]
public ExportFactory<ILedPanel> PanelFactory { get; set; }

public ILedPanel CreateNewLedPanelInstance()
{
    return PanelFactory.CreateExport().Value;
}
Run Code Online (Sandbox Code Playgroud)

此方法还满足创建零件的任何导入.你可以阅读更多有关使用ExportFactory在这里.


小智 5

除非我误解了这个问题,否则只需使用CreationPolicy.NonShared即可解决.

这假定声明Panel的代码存在于您想要面板的任何位置.您将在具有此声明(导入)的每个类的每个实例中获得ILedPanel的新实例.