Я предполагаю, что вы обнаружили пространства имен System.CompononentModel.Composition
и System.CompononentModel.Composition.Hosting
.
Позвольте мне привести здесь простой пример (и посмотреть, не упустили ли вы что-нибудь).
Прежде всего вам нужен компонент для инъекции:
public interface IMefTest
{
string Message {get;}
}
[Export(typeof(IMefTest))]
public class MefTest: IMefTest
{
public string Message {get { return "Hello World"; }}
}
Далее вам нужно настроить CompositionService
(это похоже на контейнер, но не совсем). Мы хотим установить это где-нибудь, чтобы об этом можно было говорить, так как это будет то место, куда вы будете обращаться для выполнения импорта (подробнее об этом во фрагменте кода после этого).
Я вставил это в App.xaml.cs в своем примере проекта:
static System.ComponentModel.Composition.ICompositionService _compositionService = null;
public static System.ComponentModel.Composition.ICompositionService CompositionService
{
get
{
if (_compositionService == null)
((App)App.Current).loadCompositionService();
return _compositionService;
}
}
private void loadCompositionService()
{
// Create a catalog where MEF will search for exported parts to plugin
var catalog = new System.ComponentModel.Composition.Hosting.AssemblyCatalog(GetType().GetTypeInfo().Assembly);
_compositionService = catalog.CreateCompositionService();
}
Просто немного информации об этом. Мы создали каталог сборок, что означает, что MEF будет опрашивать только эту сборку в поисках экспортируемых типов. Существуют и другие типы каталогов, и я считаю, что вы сможете объединить 2 или более каталогов вместе.
Хорошо, на моей странице (кстати, я встроил это в пример C# HelloWorld из документации по началу работы в MSDN).
Чтобы получить экземпляр одной из частей в каталоге, вам просто нужно добавить свойство в класс, который вы хотите получить, и добавить атрибут импорта (есть также способы указать аргументы в вашем конструкторе, но я пытаюсь оставаться простым)
[Import]
public IMefTest Tester { get; set; }
В этом примере вам потребуется вызвать метод SatisfyImportsOnce службы композиции для этого класса. Я сделал это в конструкторе, и я сделал это так:
if(App.CompositionService != null)
App.CompositionService.SatisfyImportsOnce(this);
(Проверка, чтобы убедиться, что сервис существует, с моей стороны избыточна... он должен существовать). После этого шага вы можете использовать свойство Tester.Message
в своем классе. В MEF гораздо больше возможностей. Я надеюсь, что это поможет вам (и если это так, вы отметите меня как ответ, поскольку я потратил драгоценное время на выставление счетов клиентам, чтобы сделать это для вас)
Кроме того, я знаю, что вы хотели просто вызвать контейнер и получить экземпляр некоторого типа. Это можно сделать с другими формами MEF, поэтому я полагаю, что это должно быть сделано с помощью WinRT, но я, честно говоря, в настоящее время не уверен).
person
DevTheo
schedule
02.03.2012