2015-02-21 3 views
1

Недавно я изучил использование MEF для создания плагиновой структуры, а также прочитал немало статей и последовал за учебниками, но чего я пытаюсь достичь (и я не видел пример этого еще) заключается в том, чтобы предоставить точку доступа, чтобы я мог загружать плагины из заданного каталога в точке (например) нагрузки формы, чтобы изменять элементы управления или предотвращать загрузку ect, или другой пример был бы нажатием кнопки в порядке до степени или еще раз препятствовать выполнению стандартных функций. Может ли кто-нибудь указать мне в сторону других ресурсов или предоставить простой пример, объясняющий, как это можно сделать?Использование MEF для взаимодействия с событиями

TIA

ответ

3

Это простой пример реализации. Сначала добавьте в проект ссылку System.ComponentModel.Composition.

Объявляет интерфейс Плагин:

[InheritedExport] 
public interface IPlugin 
{ 
    string Name { get; } 
} 

в той же или другой сборке, реализовать интерфейс сильфона.

public class Plugin1 : IPlugin 
{ 
    public string Name 
    { 
     get { return "Plugin#1"; } 
    } 
} 

Позже построить свой Каталог использованием DirectoryCatalog и AssemblyCatalog.

public class CatalogManager : IDisposable 
{ 
    [ImportMany(typeof (IPlugin), AllowRecomposition = true)] 
    private IEnumerable<IPlugin> _plugins; 

    private CompositionContainer _container; 

    public CompositionContainer Container 
    { 
     get { return _container; } 
    } 

    public IEnumerable<IPlugin> Plugins 
    { 
     set { _plugins = value; } 
    } 

    private CatalogManager(string pluginsDir) 
    { 
     var catalog = new AggregateCatalog(); 

     //--load all plugin from plugin directory 
     if (Directory.Exists(pluginsDir)) 
      catalog.Catalogs.Add(new DirectoryCatalog(pluginsDir)); 

     //--load all plugin from executing assembly 
     catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 

     Initialize(catalog); 
    } 

    private void Initialize(AggregateCatalog catalog) 
    { 
     _container = new CompositionContainer(catalog); 

     _container.ComposeParts(this); 
    } 

    public void Dispose() 
    { 
     if (_container == null) 
      return; 

     _container.Dispose(); 
     _container = null; 
    } 
} 
+0

Этот ответ - отличное начало. Но я не вижу, где это связано с событиями. –

Смежные вопросы