You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:15:24