【问题标题】:Update the value set by CompositionContainer.ComposeExportedValue in MEF更新 MEF 中 CompositionContainer.ComposeExportedValue 设置的值
【发布时间】:2015-05-13 18:33:07
【问题描述】:

我在 MEF 中使用 ImportingConstructor,例如:

public class ClassA : IClassA
{
    private string _message;

    public ClassA()
    {
        _message = "Message from constructor 1 of class A";
    }

    [ImportingConstructor]
    public ClassA([Import("ClassA_n")]int n)
    {
        _message = "Message from constructor 2 of class A: " + n.ToString();
    }
}

参数 n 使用 ComposeExportedValue 组成,例如:

container.ComposeExportedValue<int>("ClassA_n", 12);

有没有办法在 CompositionContainer 的同一个实例(容器)中更新或删除/重新组合 n 的值,比如 20 而不是 12?

谢谢

更新: 首先,我是使用 MEF 的新手,我试图创建一个简单的问题场景。我可能过于简化了它并转移了实际问题。实际上,我有一个工厂类,它为我提供了一个基于指定类型的导出类。导出的类有一个类型为 ClassB 的构造函数参数。

public class ClassFactory 
{
    public T GetClassA<T>() where T : IClassA
    {
        return MEF.CurrentContainer.GetExportedValue<T>();
    }
}
public class ClassA : IClassA
{
    [ImportingConstructor]
    public ClassA(IClassB classB)
    {
    }
}

现在我想要告诉工厂类是重用 ClassB 的现有实例(之前导入的)进行多次调用还是重置/创建一个新实例。我也尝试过 CreationPolicy.NonShared,但无法弄清楚如何在我的场景中使用它。我不想一直或所有类都需要新实例,而是想控制它。

【问题讨论】:

  • 我不知道如何解决这个问题,但是如果我可以提供一些建议,请考虑尝试考虑添加两个或三个相关标签,这样您可能会吸引更多人熟悉问题。 :)
  • 感谢奥古斯塔!但是,由于声誉级别,它不允许我添加新标签。
  • 是否有意在每次调用 ComposeExportedValue() 时创建一个新实例?
  • @alexm,请查看我的问题的更新。我试图使用 ComposeExportedValue() 但它可能不是必需的。

标签: c# .net mef


【解决方案1】:

感谢@BrunoLM 提供链接,但当您进行非共享导出时,该解决方案有效。不幸的是我有共享出口。

我找到的解决方案是使用函数 CompositionContainer.Compose(CompositionBatch batch)。 CompositionBatch 让您可以更好地控制要导出的零件。您可以使用 CompositionBatch.RemovePart 重置任何部分,然后再次调用 CompositionContainer.Compose。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 2013-05-20
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多