目前我的WPF应用程序导入了像这样的部分
[Import(typeof(ILedPanel)]
public ILedPanel Panel { get; set; }
但是这给了ma实现ILedPanel的类的单个intance。 我真正想要做的是能够创建尽可能多的实例 我需要的。请注意,ILedPanel只包含一个导出 在任何给定时间使用该软件。
(如果我使用带有List的导入,它给了我一个实例 对于实现ILedPanel的每个类)
有什么建议吗?
答案 0 :(得分:10)
我不确定这是否是Nicolas所指的,但您可以导入Factory类而不是实例类,如下所示:
[Import(typeof(ILedPanelFactory)]
public ILedPanelFactory PanelFactory { get; set; }
...然后在你的代码中......
ILedPanel panel = PanelFactory.BuildPanel();
答案 1 :(得分:9)
今天在MEF中没有“内置”支持,但在恢复服务定位器之前,您可能会在这里找到一些灵感:http://blogs.msdn.com/nblumhardt/archive/2008/12/27/container-managed-application-design-prelude-where-does-the-container-belong.aspx
基本思想是将容器“导入”需要进行动态实例化的组件。
我们正在探索对这种情况的更直接支持。
尼克
更新: MEF现在已经为此提供了实验支持。有关详细信息,请参阅this blog post。
答案 2 :(得分:8)
所有其他答案都很老,所以他们没有在MEF中提到一个名为ExportFactory
的相对较新的功能。这个通用类允许您导入ExportFactory<ILedPanel>
并根据需要创建任意数量的实例,因此您的代码将如下所示:
[Import(typeof(ILedPanel)]
public ExportFactory<ILedPanel> PanelFactory { get; set; }
public ILedPanel CreateNewLedPanelInstance()
{
return PanelFactory.CreateExport().Value;
}
此方法还满足创建零件的任何导入。您可以详细了解如何使用ExportFactory
类here。
答案 3 :(得分:5)
除非我误解了这个问题,否则只需使用CreationPolicy.NonShared即可解决。
这假设声明Panel的代码存在于您想要面板的任何位置。您将在具有此声明(导入)的每个类的每个实例中获得ILedPanel的新实例。
答案 4 :(得分:3)
查看MEF附带的形状游戏示例,有ShapeFactory类:
[Export]
public class ShapeFactory
{
private readonly Random random = new Random((int)DateTime.Now.Ticks);
[Import]
private ICompositionService CompositionService { get; set; }
public IShape GetRandomShape()
{
var shapeRetriever = new ShapeRetriever();
CompositionService.SatisfyImports(shapeRetriever);
int randomIndex = random.Next(shapeRetriever.PossibleShapes.Length);
return shapeRetriever.PossibleShapes[randomIndex].GetExportedObject();
}
private class ShapeRetriever
{
[ImportMany(RequiredCreationPolicy = CreationPolicy.NonShared)]
public Export<IShape, IShapeMetadata>[] PossibleShapes { get; set; }
}
}
其中演示了如何“按需”创建随机形状实例...我认为在您的场景中,您可以在不选择随机实现的情况下执行类似操作,因为您建议只有一个ILedPanel注册实现。 / p>
答案 5 :(得分:2)
我认为你的意思是你想在这个实例中使用MEF,就像服务定位器而不是依赖注入容器一样。尝试查看ValueResolver的示例