MEF: как импортировать из экспортируемого объекта? - PullRequest
1 голос
/ 06 августа 2010

Я создал плагин MEF, который импортирую в свое приложение. Теперь я хочу, чтобы плагин мог импортировать детали из приложения. Я не могу понять, как настроить каталог в плагине, чтобы он мог найти экспорт из приложения. Может кто-нибудь сказать мне, как это делается? Ниже приведен мой код, который не работает, когда я пытаюсь создать AssemblyCatalog с текущей исполняемой сборкой.

[Export(typeof(IPluginControl))]
public partial class MyPluginControl : UserControl, IPluginControl

    [Import]
    public string Message { get; set; }


    public MyPluginControl()
    {
        InitializeComponent();
        Initialize();
    }

    private void Initialize()
    {
        AggregateCatalog catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
        CompositionContainer container = new CompositionContainer(catalog);
        try
        {
            container.ComposeParts(this);
        }
        catch (CompositionException ex)
        {
            Console.WriteLine(ex.ToString());
        }

    }
}

1 Ответ

2 голосов
/ 06 августа 2010

Вам не нужно это делать.

Просто убедитесь, что каталог, который вы используете, когда вы импортируете этот плагин, включает сборку основного приложения.

Когда MEF создает ваш тип для его экспорта (чтобы выполнить импорт IPluginControl в другом месте), он уже скомпоновает эту часть для вас - и в этот момент импортирует строку «Сообщение» (хотя вы Скорее всего, следует назначить имя этому «сообщению» или пользовательскому типу какого-либо другого типа, иначе он просто импортирует строку, и вы можете использовать только один «строковый» экспорт в любом месте вашего приложения).

Когда MEF компонует части, он находит все типы, соответствующие указанному типу (в данном случае IPluginControl), создает экземпляр одного объекта, удовлетворяет любые [Import] требования для этого объекта (поэтому вам не нужно составлять в вашем конструкторе), затем назначает его любым объектам, импортирующим тип.

...