使用MEF与事件交互

时间:2015-02-21 01:28:17

标签: c# winforms mef

我最近考虑使用MEF来构建一个插件框架,并且阅读了不少文章并且遵循了教程但是我试图实现的目标(我还没有看到这个例子)是提供一个访问点,以便我可以在(例如)表单加载点从一个设置目录加载插件,以便改变控件或防止加载等,或者另一个例子是按钮点击以扩展或再次阻止发生标准功能。任何人都可以指出我的其他资源的方向或提供一个简单的例子来解释如何实现这一目标吗?

TIA

1 个答案:

答案 0 :(得分:3)

这是一个简单的实现示例。首先将引用System.ComponentModel.Composition添加到项目中。

声明插件界面:

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

在相同或另一个组件中,实现波纹管接口。

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

稍后使用DirectoryCatalogAssemblyCatalog制作您的目录

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;
    }
}