gpt4 book ai didi

c# - MEF2 如何使用基于约定的导入从 CompositionHost 导出中获取元数据

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

这是我的第一个 SO 问题所以请多多包涵...

我正在尝试使用 ConventionBuilder 类通过 MEF2 加载组件。在我需要访问作为导入类型的属性可用的元数据之前,一切都按预期进行。假设我有以下类(class):

[RuntimeCheckAttribute("MyString1", "MyString2", MyEnum.Value1)]
class ImportedClass : IRuntimeCheck
{...}

现在我可以有一个 ConventionBuilder 实例来定义“IRunTimeCheck”实例的约定:

ConventionBuilder conventions = new ConventionBuilder();
conventions.ForTypesDerivedFrom<IRuntimeCheck>()
.Export(exp => exp.AsContractType<IRuntimeCheck>()).Shared();

然后,我将使用已配置为检查程序集列表的“CompositionHost”实例。调用

var runtimeChecks = container.GetExports<IRuntimeCheck>();

然后将创建所有导出的“IRuntimeCheck”类型的实例。

我现在的问题是如何在导出过程中访问 IRunTimeCheck 类型上的元数据。使用 MEF1,我可以使用 ImportMany/Lazy 机制。直到现在,我还没有找到使用 MEF2 重建此行为的好方法,因为“CompositionHost”上的所有导出重载都不允许我访问元数据属性。

我已经使用 AddPartMetaData 在 ConventionBuilder 级别添加了元数据:

conventions.ForTypesDerivedFrom<IRuntimeCheck>()
.AddPartMetadata("securityRuntimeMetadata", AddRuntimeCheckMetadata)
.Export(exp => exp.AsContractType<IRuntimeCheck>()).Shared();

private object AddRuntimeCheckMetadata(Type arg)
{
RuntimeCheckAttribute metadata = (arg.GetCustomAttributes<RuntimeCheckAttribute>(false) as
RuntimeCheckAttribute[]).FirstOrDefault();
if (metadata == null)
{
throw new InvalidOperationException("errorMessage");
}
return metadata;
}

当我调试 MEF2 代码时,我可以看到在约定生成器级别添加了元数据信息。但我不知道如何再次导出此信息。我发现了一些尝试使用 ExportFactory 的帖子。但是他们中的大多数都在使用非共享导出,这不是我的目标。

最佳答案

正如我在评论中所写的那样,我遇到了类似的问题。经过一些尝试和代码单步执行后,我在没有实例化类型的情况下获得了必要的元数据。

这是我的 ConventionBuilder 配置:

var cb = new ConventionBuilder();
cb.ForTypesDerivedFrom<IHttpController>()
.AddPartMetadata(MetadataApiControllerName, t => t.FullName)
.Export(ex => ex.AddMetadata(MetadataApiControllerName, t => t.FullName))
.ExportInterfaces();

cb.ForTypesMatching(t => t.BaseType != null && (
(t.BaseType.Name.Equals(MetadataControllerName) && !t.BaseType.Name.StartsWith("T4MVC"))
|| t.BaseType.Name.Equals(MetadataExtentionControllerName)
))
.AddPartMetadata(MetadataControllerName, t => t.FullName)
.Export(ex => ex.AddMetadata(MetadataControllerName, t => t.FullName))
.ExportInterfaces();

我正在处理一个 MVC/Web Api 项目,只需要一些 Controller 的一些元信息。为了得到它们,我使用这个导出:

var controllerExport = _compositionContainer.Container.Value.GetExports<ExportFactory<IController, IDictionary<String, Object>>>()
.FirstOrDefault(
part => part.Metadata != null &&
part.Metadata.ContainsKey(DefaultContainerConfiguration.MetadataControllerName) &&
part.Metadata.Any(v => v.Value.ToString()
.EndsWith(controllerName + ControllerNameByConvention, true,
CultureInfo.InvariantCulture)));

ExportFactory 对象提供请求的元数据字典 (IDictionary<String, Object>)。

关于c# - MEF2 如何使用基于约定的导入从 CompositionHost 导出中获取元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24935261/

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