Я предполагаю, что вы обнаружили 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 или более каталогов.
Хорошо, на моей странице (BTW, я построил это в примере C# HelloWorld из документов Getting Started on MSDN).
Чтобы получить экземпляр одной из частей каталога, вам просто нужно добавить свойство к классу, который вы хотите получить, и добавить атрибут импорта (есть также способы указать аргументы в вашем конструкторе, но Я пытаюсь остаться простым)
[Import]
public IMefTest Tester { get; set; }
в этом примере, вам нужно вызвать метод SatisfyImportsOnce на службу композиции, по этому классу. Я сделал это в конструкторе, и я сделал это так:
if(App.CompositionService != null)
App.CompositionService.SatisfyImportsOnce(this);
(Проверка, чтобы убедиться, что сервис существует, это излишество с моей стороны .. он должен существовать). После этого шага вы можете использовать свойство Tester.Message
в своем классе. В MEF есть намного больше вариантов. Я надеюсь, что это поможет вам (и если это вы отметите меня как ответ, поскольку я потратил драгоценное время на выставление счетов клиентам, чтобы сделать это за вас)
Кроме того, я знаю, что вы хотели просто вызвать контейнер и дать ему вы возвращаете экземпляр некоторого типа. Это можно сделать с другими формами MEF, поэтому я предполагаю, что это можно сделать с помощью WinRT, но я честно не уверен в это время).
вы нашли решение? Я закончил с ExportFactory и SatisfyImportsOnce, но я не удовлетворен этим, мне нужно просто GetExportedValues –
Я общаюсь с одним из ребят, разрабатывающих MEF для приложений в стиле метро. Он сказал мне, что SatisfyImportsOnce в настоящее время является единственным способом создания элементов. Он спросил меня, какие конкретные сценарии я имею в виду, которые не поддерживаются SatisfyImportOnce: http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/6aff302d-867a-4921-86ae-b8088c47560f Я нашел крошечную альтернативу MEF на данный момент: http://metroioc.codeplex.com/ Надеюсь, он также может вам помочь. – Enyra
Я не хочу использовать другие фреймворки, так как хочу поделиться некоторым кодом между проектами. и как только я уже использую MEF в исходном проекте, я хочу продолжать его использовать. Мои потребности не слишком большие, поэтому я предпочитаю добавлять недостающие функции. Я добавлю свое текущее решение в качестве ответа. –