C#学习教程:MEF2中强类型元数据(System.Composition)分享


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

我在新的ASP.NET MVC4项目中使用来自MEF的System.Composition命名空间用于Web和Windowsapp store应用NuGet包 。

我已经读过 ,在MEF2中你不再使用Lazy ,但是现在你必须为元数据视图提供一个具体的类型(并且可能使用ExportFactory 而不是Lazy ?)。

但是,我找不到任何关于如何工作的例子 – 只提到使用具体类型而不是接口。

我已经尝试了一些方法,但不断收到以下错误 – “ 缺少’AccountID’的导出元数据,并且没有提供默认值 ”。

我的代码……

创建容器(在Global.asax或App_Start文件夹中):

 // Get assemblies that will be providing imports and exports var assemblies = GetAssemblies(); // Get conventions that will be used to find imports and exports var conventions = GetConventions(); var container = new ContainerConfiguration().WithAssemblies(assemblies, conventions).CreateContainer(); // Create and apply a MefControllerFactory so controllers can be composed ControllerBuilder.Current.SetControllerFactory(new MefControllerFactory(container)); 

GetConventions()方法:

 private static ConventionBuilder GetConventions() { var conventionBuilder = new ConventionBuilder(); conventionBuilder.ForTypesDerivedFrom().Export(); conventionBuilder.ForTypesDerivedFrom().Export(); conventionBuilder.ForTypesMatching(t => t.Namespace != null && t.Namespace.EndsWith(".Parts")).Export().ExportInterfaces(); return conventionBuilder; } 

IExtension.cs:

 public interface IExtension { void DoWork(); } 

ExtensionMetadata.cs:

 public class ExtensionMetadata { public int AccountID { get; set; } } 

ExtensionA.cs(与ExtensionB.cs相同):

 public void DoWork() { System.Diagnostics.Debug.WriteLine("ExtensionA doing work.."); } 

ExtensionManager.cs:

 public class ExtensionManager { private IEnumerable<ExportFactory> _extensions; public ExtensionManager(IEnumerable<ExportFactory> extensions) { _extensions = extensions; } public void DoWork(int accountID) { foreach (var extension in _extensions) { if (extension.Metadata.AccountID == accountID) { extension.DoWork(); } } } } 

我想我在这里缺少一些非常重要的东西。 基本上我想懒洋洋地导入所有扩展,检查他们的元数据,如果条件满足,该扩展做什么。

非常感谢您的反馈或任何涵盖我的场景的示例代码/教程的链接。

非常感谢!

我想在阅读了这个问题后我已经解决了。

我创建了一个元数据属性:

 [MetadataAttribute] public class ExtensionMetadataAttribute : ExportAttribute, IExtensionMetadata { public int AccountID { get; set; } public ExtensionMetadataAttribute(int accountID) : base(typeof (IExtension)) { AccountID = accountID; } } 

然后修改了ExtensionA.cs:

 [ExtensionMetadata(1)] public class ExtensionA : IExtension { public void DoWork() { System.Diagnostics.Debug.WriteLine("ExtensionA doing work.."); } } 

现在ExtensionManager.cs看起来像这样:

 public class ExtensionManager : IExtensionManager { private readonly IEnumerable> _extensions; public ExtensionManager(IEnumerable> extensions) { _extensions = extensions; } public void DoWork(int accountID) { foreach (var extension in _extensions) { if (extension.Metadata.AccountID == accountID) { using (var foo = extension.CreateExport()) { foo.Value.DoWork(); } } } } } 

这似乎可以解决问题,但我仍然会对任何反馈最佳实践,性能问题等感兴趣。

谢谢!

上述就是C#学习教程:MEF2中强类型元数据(System.Composition)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1269828.html

(0)
上一篇 1天前
下一篇 1天前

精彩推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注