2016-02-28 2 views
0

Я ищу MEF 2 (Microsoft.Composition) и хочу интегрировать его с моей существующей базой кода.Как я могу экспортировать завод и/или его метод в MEF 2?

Мое текущее кодовый имеет 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. 
} 

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

Возможно ли достичь того, что я хочу делать с MEF 2?

ответ

2

public Class Create() => new Class(); не является делегатом. В C# 6 это называется Expression-bodied member function.

Следующие 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(); 
+0

Привет @ Метро-Смурф спасибо за ваш ответ. Я действительно понимаю, что метод - это то, что вы описываете, а не делегат. Я хочу, чтобы делегат вышел из этого метода: 'Func @delegate = new Func (factory.Create);' и затем зарегистрировать __that__ в качестве экспорта. Имеют смысл? Я также понимаю, что ваш ответ даст мне прямой экспорт «IFactory ». Однако это не то, что я ищу. Пожалуйста, обратитесь к моему вопросу, чтобы увидеть точный экспорт, который я желаю. Смотрите: магия. :) Если я запрашиваю объект класса, я на самом деле вызываю 'factory.Create' где-то. Еще раз спасибо! –

+0

Я, вероятно, неправильно понял вопрос; Извини за это. Сегодня я могу поближе познакомиться, но несколько вещей, которые нужно учитывать: 1. Используйте экспорт свойств, который будет просто экспортировать все, что возвращается из свойства. 2. Дайте это прочитать: [Разрешение закрытых типов с помощью MEF Марк Семанн] (http://blog.ploeh.dk/2011/03/14/ResolvingclosedtypeswithMEF/) Опять же, извинения за неправильное понимание. –

+0

Не беспокойтесь! Мы все были там. :) Я действительно знаю пост г-на Семана, но, если это возможно, искал другой маршрут. Что-то, что не требует, чтобы я указывал типы. Я просто хочу, чтобы '[Export]' 'IFactory', а MEF« только знает », как вызвать его метод« Create »и вернуть экземпляр. В Unity есть «InjectionFactory», который можно использовать при регистрации типа. Я ищу что-то сопоставимое для MEF 2. После копания я [нашел это] (https://github.com/MefContrib/MefContrib/blob/master/src/MefContrib/Hosting/FactoryExportProvider.cs), но это MEF 1. –

Смежные вопросы