8

私はMEFを使い始めており、次のような複数のコンストラクターを持つクラスがあります。

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

2番目のコンストラクターに値を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

クラスの2番目のコンストラクターがfoo呼び出されないことを除いて、すべてが正常に機能します。どうしたの?

MEFがクラスをインスタンス化するときに使用するコンストラクターを選択するにはどうすればよいですか?

4

2 に答える 2

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; }
}
于 2010-05-31T17:01:10.047 に答える
3

foo クラスのインスタンスを ComposeExportedValue メソッドに渡していますか? その場合、オブジェクトは既に構築されており、コンストラクターを再度呼び出すことはできないため、MEF はコンストラクターのインポートを無視します。

于 2010-05-31T05:32:48.213 に答える