Как я могу экспортировать фабрику и / или ее метод в 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();