[英]If using DI + MEF, what is a good method to pass events between classes in the container?
[英]Using MEF to interact with events
我最近考虑使用MEF来构建一个插件框架,并且阅读了很多文章并且遵循了教程但是我试图实现的目标(我还没有看到这个例子)是提供一个访问点所以我可以在(例如)表单加载点从一个设置目录加载插件,以便改变控件或防止加载等,或者另一个例子是按钮点击以扩展或再次阻止标准功能发生。 任何人都可以指向我其他资源的方向或提供一个简单的例子来解释如何实现这一目标吗?
TIA
这是一个简单的实现示例。 首先将参考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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.