是否可以将现有实例注入MEF插件?
我们正在创建一个使用MEF支持插件的应用程序。 我们正在确定用户能够创建什么类型的插件,并希望使用dependency injection来为这种类型的插件提供所需的数据。
例如,我们制作了一个能够显示列表的插件。 为了实现这一点,它需要IRepository的现有实例来显示列表将显示的数据类型。
IRepository是在datacontext类的其他地方创建的,因此我们无法让MEF自己创建IRepository的实例。
我的想法是通过importconstructor将现有的IRepository实例注入到插件中,但为了实现这一点,我需要让MEF知道已经实例化的IRepository,并且我无法弄清楚如何去做。 任何帮助,将不胜感激。
最简单的方法是在容器中组合现有值,例如:
var repo = // Create repo container.ComposeExportedValue(repo);
但这只允许存在1个IRepository
实例,因为它不能直接控制所创建的ComposablePart
。 如果你想要更细粒度的控制,你可以使用CompositionBatch
产生很好的效果:
var batch = new CompositionBatch(); var repo = // Create repo var repoPart = batch.AddExportedValue(repo); container.Compose(batch); // repo will now be injected on any matching [Import] or [ImportingConstructor]
后来:
var batch2 = new CompositionBatch(null, new[] { repoPart }); var repo2 = // Get new repo var repo2Part = batch2.AddExportedValue(repo2); container.Compose(batch2);
因为我可以访问批处理提供的ComposablePart
实例,所以稍后我可以将其删除。 还有其他方法可以导入无属性的部分,通常是通过属性导出:
[Export(typeof(IRepository))] public IRepository Repository { get { return CreateRepository(); } }
但这当然要求您能够在合成时创建存储库的实例,这可能是也可能是不可能的。
最后,可以选择使用替代编程模型。 MEF中的默认(和最常见)是属性编程模型,您可以使用[Export]
和[Import]
属性来控制您的构图,但在MEFContrib(以及即将出现的MEF2)中,能够使用注册编程模型,从而部件基于类似于大多数其他IoC容器的机制组成。