Параметры конструктора MEF с несколькими конструкторами

Я начинаю использовать 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 экземпляр я использую свойство значения, FooList[0].Value.

Everthing хорошо работает, за исключением того, что второй конструктор foo класс никогда не называют. Что случилось?

Как я выбираю конструктора, которого я хочу использовать, когда MEF инстанцирует класса?

8
задан Kit 10 October 2011 в 19:55
поделиться

2 ответа

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; }
}
8
ответ дан 5 December 2019 в 15:20
поделиться

Вы передаете экземпляр класса foo в метод ComposeExportedValue? В этом случае объект уже создан и конструктор не может быть вызван снова, поэтому MEF проигнорирует импорт конструктора.

3
ответ дан 5 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: