具有多个构造函数的MEF构造函数参数

时间:2010-05-31 02:55:11

标签: c# .net mef multiple-constructors

我开始使用MEF,我有一个包含多个构造函数的类,如下所示:

[Export(typeof(ifoo))]
class foo : ifoo {
    void foo() { ... }
    [ImportingConstructor]
    void foo(object par1) { ... }
}

我在撰写时使用catalog.ComposeExportedValue()来提供par1 值到第二个构造函数:

...
catalog.ComposeExportedValue(par1Value);
catalog.ComposeParts(this);
...

保留我正在使用的组件:

[ImportMany(typeof(ifoo))]
public List<Lazy<ifoo, ifoometadata>> FooList { get; set; }

要创建foo实例,我正在使用value属性FooList[0].Value

Everthing工作正常,但永远不会调用foo类的第二个构造函数。怎么了?

当MEF实例化类时,如何选择我想要使用的构造函数?

2 个答案:

答案 0 :(得分:8)

MEF应该使用你放置ImportingConstructorAttribute的构造函数。我不确定你发生了什么,我无法重现这个问题。这是一个测试,它显示了在具有默认构造函数的类上使用ImportingConstructor:

[TestClass]
public class MefTest
{
    public const string ConstructorParameterContract = "FooConstructorParameterContract";

    [TestMethod]
    public void TestConstructorInjectionWithMultipleConstructors()
    {
        string ExpectedConstructorParameterValue = "42";

        var catalog = new TypeCatalog(typeof(Foo), typeof(FooImporter));
        var container = new CompositionContainer(catalog);

        container.ComposeExportedValue<string>(ConstructorParameterContract, ExpectedConstructorParameterValue);

        var fooImporter = container.GetExportedValue<FooImporter>();

        Assert.AreEqual(1, fooImporter.FooList.Count, "Expect a single IFoo import in the list");
        Assert.AreEqual(ExpectedConstructorParameterValue, fooImporter.FooList[0].Value.ConstructorParameter, "Expected foo's ConstructorParameter to have the correct value.");
    }
}

public interface IFoo
{
    string ConstructorParameter { get; }
}

[Export(typeof(IFoo))]
public class Foo : IFoo
{
    public Foo()
    {
        ConstructorParameter = null;
    }

    [ImportingConstructor]
    public Foo([Import(MefTest.ConstructorParameterContract)]string constructorParameter)
    {
        this.ConstructorParameter = constructorParameter;
    }


    public string ConstructorParameter { get; private set; }
}

[Export]
public class FooImporter
{
    [ImportMany]
    public List<Lazy<IFoo>> FooList { get; set; }
}

答案 1 :(得分:3)

您是否将foo类的实例传递给ComposeExportedValue方法?在这种情况下,对象已经被构造,并且不能再次调用构造函数,因此MEF将忽略构造函数的导入。