gpt4 book ai didi

c# - MEF2 (System.Composition) 中的强类型元数据

转载 作者:行者123 更新时间:2023-11-30 12:12:18 30 4
gpt4 key购买 nike

我正在使用 MEF for web and Windows Store apps NuGet package 中的 System.Composition 命名空间在新的 ASP.NET MVC4 项目中。

我已经 read在 MEF2 中你不再使用 Lazy<IExtension, IExtensionMetadata> ,但现在您必须为元数据 View 提供具体类型(并且可能使用 ExportFactory<> 而不是 Lazy<> ?)。

但是,我找不到任何示例来说明这一切应该如何工作 - 只是提到使用具体类型而不是接口(interface)。

我已经尝试了一些方法,但不断收到以下错误 - “缺少“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<IController>().Export();

conventionBuilder.ForTypesDerivedFrom<IExtension>().Export<IExtension>();
conventionBuilder.ForTypesMatching(t => t.Namespace != null && t.Namespace.EndsWith(".Parts")).Export().ExportInterfaces();

return conventionBuilder;
}

IExtension.cs:

public interface IExtension
{
void DoWork();
}

扩展元数据.cs:

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

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

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

扩展管理器.cs:

public class ExtensionManager
{
private IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> _extensions;

public ExtensionManager(IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> extensions)
{
_extensions = extensions;
}

public void DoWork(int accountID)
{
foreach (var extension in _extensions)
{
if (extension.Metadata.AccountID == accountID)
{
extension.DoWork();
}
}
}
}

我想我在这里遗漏了一些非常重要的东西。基本上我想延迟导入所有扩展,检查它们的元数据,如果满足条件,则让该扩展执行某些操作。

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

非常感谢!

最佳答案

我想我在阅读后已经解决了 this SO question .

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

[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<ExportFactory<IExtension, ExtensionMetadata>> _extensions;

public ExtensionManager(IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> 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) 中的强类型元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13914256/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com