当前位置: 首页 > 编程语言 > C#

mefenumexportandbuildingshare

时间:2023-04-11 12:12:27 C#

mefenumexportandbuilding:每个插件都可以创建自己的接口IPlugin1,IPlugin2...每个接口必须有指定的functionLoad,UnloadUsingmef我想枚举所有导出并调用load/unload问题:a.我的解决方案好吗,如果不好,我怎么能改进它(通过使用其他东西)?b.如何使用mef枚举所有导出并调用指定的接口函数?我将感谢所有链接和评论者。谢谢大家。根据@my的回答,我认为有一个共同点接口是您可以使用的最佳设计。这是利用可应用于插件的一组通用操作的最简单方法。我认为是一个轻微的改进:publicinterfaceIPlugin:IDisposable{voidInitialise();通过强制执行Dispose方法,您可以自动控制CompositionContainer的生命周期管理功能。所有卸载代码都可以进去,这里有一个示例插件:publicinterfaceILogger:IPlugin{voidLog(stringmessage);}[Export(typeof(ILogger))]publicclassConsoleLogger:ILogger{voidIPlugin.Initialise(){Console.WriteLine("Initialisingplugin...");}publicvoidLog(stringmessage){Console.WriteLine(message);}publicvirtualvoidDispose(booldisposing){if(disposing){Console.WriteLine("Disposingplugin...");}}publicvoidDispose(){Dispose(true);GC.SuppressFinalize(这个);Dispose模式允许使用标准化机制来清理代码。您的CompositionContainer实例将跟踪此项目,并在处理时清理它。现在,我要描述的是MEFContrib中一个名为InterceptingCatalog的新函数。该目录允许您做的是注册拦截策略,允许您在返回调用代码之前访问导出的值。一种这样的用法可能是在首次导出实例时自动确保IPlugin在基础IPlugin接口上初始化:publicclassInitialisePluginStrategy:IExportedValueInterceptor{if(plugin!=null)plugin.Initialise();返回值;}}让我们把这一切联系在一起:staticvoidMain(string[]args){varcatalog=newAssemblyCatalog(typeof(Program).Assembly);varconfiguration=newInterceptionConfiguration().AddInterceptor(newInitialisePluginStrategy());varinterceptingCatalog=newInterceptingCatalog(目录,配置);varcontainer=newCompositionContainer(interceptingCatalog);varlogger=container.GetExportedValue();logger.Log("测试");安慰。读取密钥();如果你运行它,你会注意到我们的ConsoleLogger在我们第一次从容器中获取它时自动初始化。我们不需要担心它会再次被初始化,它只会在创建导出实例时才会这样做,这意味着它同时服从单例和非单例场景。您可能会认为这可能有点矫枉过正,但它实际上是一个非常优雅的解决方案,可以让您的部件自动启动并在不再需要时处理它们。当然,如果你想细粒度地控制你的小部件是如何初始化的,你可以用你自己写的方法来管理它们,你只需要考虑插件状态。您可以在PiotrW?odek的博客上阅读有关InterceptingCatalog的更多信息如果您希望所有插件接口都遵循您自己的接口,那么您应该为它们提供一个扩展接口:无效卸载();然后,当插件创建自己的接口时,它们应该从您公开提供的接口扩展:publicinterfaceIPlugin1:IMyInterface{voidDoPlugin1Func();现在,为了获取MEF中导出的接口集合,您必须将接口标记为InheritedExport:[InheritedExport(typeof(IMyInterface))]publicinterfaceIMyInterface{...}IMyInterface将作为IMyInterface的一种类型导出,甚至沿着树向下://此类将作为IMyInterface导出publicclassPluginImplementation1:IPlugin1{...}最后,在代码的某处(如果适用),您可以导入一个IMyInterface实例的集合。公共类SomeClass{[ImportMany(typeof(IMyInterface))]privateIEnumerablePlugins{get;放;如果一切都正确连接,插件将是类的枚举,通过继承,导出为IMyInterface。资源:以上就是C#学习教程:mefenumexport和搭建分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢