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

MEF2中的强类型元数据(System.Composition)分享

时间:2023-04-10 11:05:40 C#

MEF2强类型元数据(System.Composition)我在新的ASP.NETMVC4项目中使用MEF的System.Composition命名空间在Web上使用NuGet包和Windows应用商店。我读到在MEF2中您不再使用Lazy,但现在您必须为元数据视图提供具体类型(并且可能使用ExportFactory而不是Lazy?)。但是,我找不到任何关于它如何工作的例子——只提到使用具体类型而不是接口。我尝试了一些方法,但不断收到以下错误-“缺少‘AccountID’的导出元数据并且未提供默认值”。我的代码……创建容器(在Global.asax或App_Start文件夹中)://获取将提供导入和导出的程序集varassemblies=GetAssemblies();//获取将用于查找导入和导出的约定varconventions=GetConventions();varcontainer=newContainerConfiguration().WithAssemblies(assemblies,conventions).CreateContainer();//创建并应用MefControllerFactory,以便可以组合控制器ControllerBuilder.Current.SetControllerFactory(newMefControllerFactory(container));GetConventions()方法:privatestaticConventionBuilderGetConventions(){varconventionBuilder=newConventionBuilder();conventionBuilder.ForTypesDerivedFrom().Export();conventionBuilder.ForTypesDerivedFrom().Export();conventionBuilder.ForTypesMatching(t=>t.Namespace!=null&&t.Namespace.EndsWith(".Parts")).Export().ExportInterfaces();返回约定生成器;}IExtension.cs:publicinterfaceIExtension{voidDoWork();}ExtensionMetadata.cs:publicclassExtensionMetadata{publicintAccountID{get;放;}}ExtensionA.cs(与ExtensionB.cs相同):publicvoidDoWork(){System.Diagnostics.Debug.WriteLine("ExtensionAdoingwork..");}ExtensionManager.cs:公共类ExtensionManager{privateIEnumerable_extensions;publicExtensionManager(IEnumerableextensions){_extensions=extensions;}publicvoidDoWork(intaccountID){foreach(varextensionin_extensions){if(extension.Metadata.AccountID==accountID){extension.DoWork();我想我在这里遗漏了一些非常重要的东西基本上我想懒惰地导入所有扩展,如果满足条件,检查它们的元数据以了解扩展的作用。非常感谢任何反馈或指向涵盖我的场景的示例代码/教程的链接。太感谢了!我想我在阅读问题后已经弄清楚了。我创建了一个元数据属性:[MetadataAttribute]publicclassExtensionMetadataAttribute:ExportAttribute,IExtensionMetadata{publicintAccountID{get;放;}publicExtensionMetadataAttribute(intaccountID):base(typeof(IExtension)){AccountID=accountID;}}然后ModifiedExtensionA.cs:[ExtensionMetadata(1)]publicclassExtensionA:IExtension{publicvoidDoWork(){System.Diagnostics.Debug.WriteLine("ExtensionAdoingwork..");现在ExtensionManager.cs看起来像这样:publicclassExtensionManager:IExtensionManager{privatereadonlyIEnumerable>_extensions;publicExtensionManager(IEnumerable>extensions){_extensions=extensions;}publicvoidDoWork(intaccountID){foreach(varextensionin_extensions){if(extension.IDAccount==accountID){using(varfoo=extension.CreateExport()){foo.Value.DoWork();}}}}}这似乎可以解决问题,但我仍然愿意接受任何对最佳实践、性能问题等感兴趣的反馈。谢谢!以上就是《C#学习教程:MEF2中的强类型元数据(System.Composition)》的全部内容。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: