gpt4 book ai didi

mef - 如何将满足导入的类的实例添加到 CompositionContainer

转载 作者:行者123 更新时间:2023-12-04 17:13:14 25 4
gpt4 key购买 nike

我遇到了以下问题:

var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Type1).Assembly));
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Type2).Assembly));

using (CompositionContainer container = new CompositionContainer(catalog))
{
}

我还需要一个导出:

Export[(typeof(Type3))]

问题是我不能在具有此 Export 属性的类中包含一个程序集。我想告诉容器:

var myObject = new Type4();

myObject(Type4 的实例)应该在每次需要 Import[(typeof(Type3))] 时导出。此外,我不能用 Export[(typeof(Type3))] 标记 Type4,而且我希望 MEF 使用该类的实例(所以用 Export 属性标记这个类不起作用,因为我之前更改了 myObject我将它传递给 MEF,并希望它用于满足 Import 的要求)。

然后当我尝试做的时候:

container.SatisfyImportsOnce(importer);

我希望 MEF 将从目录中的程序集中获取所有对象,对于缺少的 Type3,它将使用 myObject。这应该是我这样做时的值(value):

container.GetExportedValue<Type3>();

我花了一天时间尝试不同的方法:自定义 ExporterProvider 和从 Type4 继承的某种类型以使用适当的 Export 属性标记它,但我无法让它按我想要的方式工作。

非常感谢您的帮助。

谢谢!

最佳答案

好的,已经找到答案了。

  1. 第一个问题是我将 2 个相同的 AssemblyCatalog 添加到 AggregateCatalog - 不要那样做。

  2. 解决方案是使用 CompositionBatch:

    var catalog = new AggregateCatalog();
    catalog.Catalogs.Add(new AssemblyCatalog(typeof(Type1).Assembly));
    catalog.Catalogs.Add(new AssemblyCatalog(typeof(Type2).Assembly));
    var myObject = new Type4();

    using (CompositionContainer container = new CompositionContainer(catalog))
    {
    var batch = new CompositionBatch();
    Export ex = CreateExport<Type3>(myObject); //Custom implementation
    batch.AddExport(ex);
    container.Compose(batch);
    var val = container.GetExportedValue<Type3>(); //value == myObject
    }

谢谢!

关于mef - 如何将满足导入的类的实例添加到 CompositionContainer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22517090/

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