.NET 6中如何创建自定义元数据提供者并无DI获取元数据?
.NET 6自定义元数据提供者相关问题解答
问题背景
你提供了如下自定义元数据属性的实现代码,用于标记实体属性是否为标识符:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public class IsIdentifierAttribute : Attribute, IMetadataAware { public bool IsIdentifier { get; set; } public IsIdentifierAttribute() { this.IsIdentifier = true; } public IsIdentifierAttribute(bool IsIdentifier) { this.IsIdentifier = IsIdentifier; } public void OnMetadataCreated(ModelMetadata metadata) { metadata.AdditionalValues["IsIdentifier"] = IsIdentifier; } }
针对你提出的两个问题,解答如下:
1. 在.NET 6中是否可以实现该功能?
完全可以。你这种通过实现IMetadataAware接口扩展模型元数据的方式,在.NET 6中依然被支持,接口位于Microsoft.AspNetCore.Mvc.ModelBinding命名空间下(需确保项目引用Microsoft.AspNetCore.Mvc.Core包)。当模型元数据生成时,OnMetadataCreated方法会被自动触发,自定义元数据会被存入ModelMetadata的AdditionalValues字典中,行为和旧版本.NET一致。
2. 如何在运行时不依赖DI获取指定类型的元数据?
在.NET 6中,旧版的ModelMetadataProviders.Current已被移除,但可以通过手动构建元数据提供者实例的方式,实现不依赖DI获取元数据,具体步骤和代码如下:
手动构建DefaultModelMetadataProvider所需的依赖项,再创建提供者实例并调用方法获取元数据:
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata; using Microsoft.Extensions.Options; public static ModelMetadata GetModelMetadata<TEntity>() { // 构建MvcOptions实例 var mvcOptions = Options.Create(new MvcOptions()); // 构建默认的元数据细节提供者 var metadataDetailsProvider = new DefaultCompositeMetadataDetailsProvider( mvcOptions.Value.ModelMetadataDetailsProviders); // 创建默认模型元数据提供者 var modelMetadataProvider = new DefaultModelMetadataProvider(metadataDetailsProvider, mvcOptions); return modelMetadataProvider.GetMetadataForType(typeof(TEntity)); }
调用示例(读取指定属性的自定义元数据):
// 获取实体类型的元数据 var entityMetadata = GetModelMetadata<YourEntity>(); // 找到目标属性的元数据 var propertyMetadata = entityMetadata.Properties.First(p => p.PropertyName == "Id"); // 读取自定义的IsIdentifier标记 var isIdentifier = (bool?)propertyMetadata.AdditionalValues["IsIdentifier"];
注意:如果你的项目中配置了自定义的
IMetadataDetailsProvider实现,需要将这些自定义提供者加入到DefaultCompositeMetadataDetailsProvider的构造参数中,否则手动创建的提供者不会包含这些自定义配置,导致元数据不完整。
内容的提问来源于stack exchange,提问作者Sohaib Ameen
相关产品推荐
相关产品推荐

