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

只使用.NET中的MEF获取必要的插件分享

时间:2023-04-11 12:01:14 C#

只使用.NET中的MEF获取必要的插件我有IMessageSender接口。使用System.ComponentModel.Composition;公共接口IMessageSender{voidSend(字符串消息);我有两个实现这个接口的插件。这是plugin.cs。使用System.ComponentModel.Composition;使用System.ComponentModel.Composition.Hosting;使用System.Reflection;使用系统;[Export(typeof(IMessageSender))]publicclassEmailSender:IMessageSender{publicvoidSend(stringmessage){Console.WriteLine(message);}}这是plugin2.cs[Export(typeof(IMessageSender))]publicclassEmailSender:IMessageSender{publicvoidSend(stringmessage){Console.WriteLine(message+"!!!!");我有这段代码可以使用MEF运行这些插件。使用System.ComponentModel.Composition;使用System.ComponentModel.Composition.Hosting;使用System.Reflection;使用System.Collections.Generic;使用系统;publicclassProgram{[ImportMany]publicIEnumerableMessageSender{get;Main(string[]args){Programp=newProgram();p.Run();foreach(p.MessageSender中的var消息){message.Send("hello,world");}}publicvoidRun(){Compose();}privatevoidCompose(){varcatalog=newAggregateCatalog();catalog.Catalogs.Add(新目录目录(@"./"));varcontainer=newCompositionContainer(catalog);container.ComposeParts(这个);}}编译后,我得到了我想要的。>monoprogram.exe你好,世界你好,世界!!!!我的问题是如何有选择地耗尽许多插件。这个例子只是获取所有可用的插件来运行它们,但是当我只想运行第一个或第二个插件时我该怎么办?例如,我可以按如下方式运行plugin2.dll吗?publicstaticvoidMain(string[]args){Programp=newProgram();p.Run();varmessage=messageSender.GetPlugin("插件");//???message.Send("你好,世界");解决基于这个网站,以及MatthewAbbott的回答。我可以想出这个工作代码。接口代码(interface.cs)usingSystem.ComponentModel.Composition;使用System.ComponentModel.Composition.Hosting;使用System.Reflection;使用系统;公共接口IMessageSender{voidSend(字符串消息);}publicinterfaceIMessageSenderMetadata{字符串名称{get;}字符串版本{get;}}[MetadataAttribute][AttributeUsage(AttributeTargets.Class,AllowMultiple=false)]publicclassMessageMetadataAttribute:ExportAttribute,IMessageSenderMetadata{publicMessageMetadataAttribute(字符串名称,字符串版本):base(typeof(IMessageSender)){Name=name;版本=版本;}公共字符串名称{得到;放;}公共字符串版本{得到;放;}}插件代码(Plugin.cs…)usingSystem.ComponentModel.Composition;使用System.ComponentModel.Composition.Hosting;使用System.Reflection;使用系统;[MessageMetadataAttribute("EmailSender1","1.0.0.0")]publicclassEmailSender:IMessageSender{publicvoidSend(stringmessage){Console.WriteLine(message+"????");}}Program.cs中使用System.ComponentModel.Composition;使用System.ComponentModel.Composition.Hosting;使用System.Reflection;使用System.Collections.Generic;使用系统;使用System.Linq;公共类程序{[ImportMany(typeof(IMessageSender),AllowRecomposition=true)]publicIEnumerableSenders{get;放;}publicstaticvoidMain(string[]args){Programp=newProgram();p.Run();varsender1=p.GetMessageSender("EmailSender1","1.0.0.0");sender1.Send("你好,世界");sender1=p.GetMessageSender("EmailSender2","1.0.0.0");sender1.Send("你好,世界");}publicvoidRun(){撰写();}publicIMessageSenderGetMessageSender(stringname,stringversion){returnSenders.Where(l=>l.Metadata.Name.Equals(name)&&l.Metadata.Version.Equals(version)).Select(l=>l.值).FirstOrDefault();}privatevoidCompose(){varcatalog=newAggregateCatalog();目录.Catalogs.Add(新目录目录(@"./"));varcontainer=newCompositionContainer(catalog);container.ComposeParts(这个);MEF支持导出自定义元数据以匹配导出的类型。您需要做的是首先定义MEF将用来创建包含元数据的代理对象的接口。在您的示例中,您可能需要为每个导出创建唯一名称,因此我们可以定义:publicinterfaceINameMetadata{stringName{get;您需要做的是确保将元数据分配给需要它的每个导出:[Export(typeof(IMessageSender)),ExportMetadata("Name","EmailSender1")]publicclassEmailSender:IMessageSender{publicvoidSend(字符串消息){Console.WriteLine(消息);MEF将做的是使用存储在ExportMetadata("Name","EmailSender1")属性中的值生成一个实现您的接口INameMetadata的项目。完成后,您可以进行一些过滤,因此将[Import]重新定义为:[ImportMany]publicIEnumerable>Senders{get;放;MEF将创建的是支持实例类型更改的惰性实例的可枚举的惰性实例。我们可以这样查询:}使用参数使用“EmailSender1”作为名称参数运行此命令将返回我们的EmailSender实例。需要注意的重要一点是我们如何根据查询与该类型关联的元数据来选择要使用的特定实例。您可以更进一步,将Export和ExportMetadata属性合并为一个属性,例如:[AttributeUsage(AttributeTargets.Class,AllowMultiple=false),MetadataAttribute](typeof(IMessageSender)){名字=名字;}公共字符串名称{得到;私有集;这允许我们使用单个属性来导出类型,同时仍然提供额外的元数据:[ExportMessageSender("EmailSender2")]很明显,以这种方式查询会给你一个设计决策。使用延迟实例意味着您将能够延迟实例的实例化,但这确实意味着每次延迟只能创建一个实例。MEF框架的Silverlight变体还支持ExportFactory类型,它允许您每次启动T个新实例,仍然为您提供丰富的元数据机制。以上就是C#学习教程:在.NET中,只使用MEF获取必要的插件,分享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢