Пример MEF [Import] C # - PullRequest
       26

Пример MEF [Import] C #

1 голос
/ 22 июня 2011

У меня проблема с расширением некоторого существующего кода C #.

Существует экземпляр класса manager, экспортированный из одного класса.Он успешно импортирован в несколько других классов, используя:

[Import]
private Manager manager = null;

Я добавил тот же код в новый класс.Он хорошо компилируется, но во время выполнения ссылка всегда равна нулю.

Я явно что-то упускаю.

Что я действительно хотел бы увидеть, так это минимальный код (два класса)необходимо выполнить импорт. Он не должен ничего делать, кроме создания и экспорта объекта (желательно не строки или простого значения) в одном классе и показа, что он не равен нулю при импорте в другой класс.(Я заблудился в деталях других примеров, пытаясь показать функциональность, а не просто используемый синтаксис.)

Обратите внимание, что мне нужно увидеть пример с использованием [Импорт], а не [Импорт (тип)].

Спасибо.

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Я почти уверен, что это будет работать:

public class SampleClass
{
    [Import]
    private Manager manager; //Setting it to null is redundant.
}


[Export]
public class Manager
{
}

Вам также необходимо настроить контейнер. Существуют фреймворки, которые облегчают соединение, но если нет. Это не сложно:

В начале подачи заявки вам необходимо заполнить каталог:

//http://mef.codeplex.com/wikipage?title=Using%20Catalogs
var catalog = new AggregateCatalog();

//Add AssemblyCatalogs (Single) or DirectoryCatalogs (Multiple)
catalog.Catalogs.Add(new AssemblyCatalog(typeof(IManager).Assembly));
catalog.Catalogs.Add(new DirectoryCatalog(@"myimports\"));

//Don't do this (including the same assembly twice)
//catalog.Catalogs.Add(new AssemblyCatalog(typeof(Manager).Assembly));

var container = new CompositionContainer(catalog);
container.composeParts(this);

Но вы действительно должны воспользоваться интерфейсами для импорта / экспорта.

public class SampleClass
{
    [Import]
    private IManager Manager;
}

[InheritedExport]
public interface IManager { }

public class Manager : IManager { }

Теперь, если указать имя и тип, в этом нет необходимости, но хорошо, если вы планируете иметь схожие экспорты, которые вам необходимо различать.

public class SomeClass
{
    //This is for the specific AdvancedManager
    [Import("AdvancedManager", typeof(IManager))]
    private IManager AdvancedManager;

    //This is for the specific SimpleManager
    [Import("SimpleManager", typeof(IManager))]
    private IManager SimpleManager;

    //If you don't mark it as ImportMany this will fail because now there
    //are 2 non-specific IManager exports.
    [ImportMany]
    private ICollection<IManager> AllManagers;
}

[InheritedExport]
public interface IManager { }

//This will export out as an IManager and a specifically named IManager
[Export("AdvancedManager", typeof(IManager))]
public class AdvancedManager : IManager { }

//This will export out as an IManager and a specifically named IManager
[Export("SimpleManager", typeof(IManager))]
public class SimpleManager : IManager { }
0 голосов
/ 28 июля 2011

менеджер должен быть собственностью. пытаться [Import] private Manager manager { get; set; }

...