gpt4 book ai didi

c# - 是否可以将现有实例注入(inject) MEF 插件?

转载 作者:太空狗 更新时间:2023-10-30 00:34:25 24 4
gpt4 key购买 nike

我们正在创建一个支持使用 MEF 的插件的应用程序。我们正在确定用户能够创建哪种类型的插件,并希望使用依赖注入(inject)为此类插件提供所需的数据。

例如,我们制作了一个能够显示列表的插件。为实现这一点,它需要 IRepository 的现有实例作为列表将显示的数据类型。

IRepository 是在数据上下文类的其他地方创建的,因此我们不能让 MEF 自己创建 IRepository 的实例。

我的想法是通过 importingconstructor 将 IRepository 的现有实例注入(inject)到插件中,但是为了实现这一点,我需要让 MEF 知道已经实例化的 IRepository,但我一直无法弄清楚如何做吧。任何帮助将不胜感激。

最佳答案

最简单的方法是在容器中组合一个现有的值,例如:

var repo = // Create repo
container.ComposeExportedValue<IRepository>(repo);

但是这将只允许 IRepository 的 1 个实例存在,因为它不会让您直接控制 ComposablePart被 build 。如果你想要更细粒度的控制,你可以使用 CompositionBatch 来达到很好的效果:

var batch = new CompositionBatch();
var repo = // Create repo

var repoPart = batch.AddExportedValue<IRepository>(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<IRepository>(repo2);
container.Compose(batch2);

因为我可以访问批处理提供的 ComposablePart 实例,所以我可以稍后将其删除。还有其他导入无属性部分的方法,通常是通过属性导出:

[Export(typeof(IRepository))]
public IRepository Repository
{
get { return CreateRepository(); }
}

但这当然要求您能够在组合时创建存储库的实例,这可能可行也可能不可行。

最后,可以选择使用替代编程模型。 MEF 中的默认(也是最常见的)是属性编程模型,您可以利用[Export][Import] 属性来控制您的组合,但在 MEFContrib 中(以及即将在 MEF2 中推出)是使用注册编程模型的能力,其中部件是基于类似于大多数其他 IoC 容器的机制组合的。

关于c# - 是否可以将现有实例注入(inject) MEF 插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com