Полагаю, вы обнаружили пространства имен 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, но я честно не уверен в это время).