Как я могу экспортировать фабрику и / или ее метод в MEF 2?

Я изучаю MEF 2 (Microsoft.Composition) и собираюсь интегрировать его с моей существующей кодовой базой.

Моя текущая кодовая база имеет IFactory интерфейс с простой подписью:

public interface IFactory<T>
{
    T Create();
}

Я хотел бы зарегистрировать свои фабрики, чтобы, если я сделаю экспорт на фабрику, она была зарегистрирована как Func<T> для завода T выход. Так что-то вроде этого:

[Export]
public class Factory : IFactory<Class>
{
    public Class Create() => new Class();
}            

Вернет новый Class экземпляр и ссылка на Create метод (как Func<Class> делегат) со следующим кодом:

using ( var container = new ContainerConfiguration()
    // ... magic missing here.
    .CreateContainer() )
{
    var instance = container.GetExport<Class>(); // instance is created from the Factory.Create above.
    var factory = container.GetExport<Func<Class>>(); // this is a reference to the Factory.Create delegate defined above.
}

Я видел этот вопрос, но, похоже, он не относится к MEF 2. Все виды вещей теперь другие, но кажутся намного более легкими / оптимизированными (как рекламируется!).

Можно ли добиться того, что я собираюсь сделать с MEF 2?

1 ответ

public Class Create() => new Class(); не является делегатом. В C# 6 это известно как функция-член с выражением Expression.

Следующие 2 утверждения эквивалентны в C# 6:

// Expression-bodied member function
public MyClass Create() => new MyClass();

// standard member function
public MyClass Create()
{
    return new MyClass();
}

Что касается решения IFactory<Class> а затем, используя фабрику, просто украсьте свою фабрику типом для экспорта и использования по мере необходимости:

[Export( typeof( IFactory<MyClass> ) )]
public class Factory : IFactory<MyClass>
{
    public MyClass Create() => new MyClass();
}

После того, как контейнер был собран, разрешение просто:

var factory = container.GetExport<IFactory<MyClass>>();

MyClass mc = factory.Create();
Другие вопросы по тегам