Параметры конструктора 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
Например, я использую свойство value, FooList[0].Value
,
Все работает нормально, за исключением того, что второй конструктор foo
класс никогда не называется. В чем дело?
Как выбрать конструктор, который я хочу использовать, когда MEF создает экземпляр класса?
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; }
}
Вы передаете экземпляр класса foo в метод ComposeExportedValue? В этом случае объект уже был создан, и конструктор не может быть вызван снова, поэтому MEF будет игнорировать импорт конструктора.