【问题标题】:Understanding metadata in aspnet core了解 aspnet 核心中的元数据
【发布时间】:2019-11-18 02:45:12
【问题描述】:

我从这里被重定向:https://github.com/aspnet/AspNetCore/issues/11963

我正在从 .Net 4.6 转换解决方案,我正在查看元数据。

在旧的解决方案中,我有一个数据注释元数据提供程序的自定义实现,我已经像这样扩展它......

   public class ApiMetadataProvider : DataAnnotationsModelMetadataProvider, IDisposable
    {
        public IResourceProvider ResourceProvider { get; }

        public ICoreDataContext CoreDb { get; }

        public ApiMetadataProvider(IResourceProvider resourceProvider, ICoreDataContext core)
        {
            ResourceProvider = resourceProvider;
            CoreDb = core;
        }

        protected override ModelMetadata CreateMetadata(
                IEnumerable<Attribute> attributes,
                Type containerType,
                Func<object> modelAccessor,
                Type modelType,
                string propertyName)
        {
            ModelMetadata modelMetadata = base.CreateMetadata(
                attributes,
                containerType,
                modelAccessor,
                modelType,
                propertyName);

            Type serverType = (modelType == typeof(string))
                ? typeof(string) 
                : modelType.ImplementsGenericInterface(typeof(IEnumerable<>)) ?? modelType;

            if (serverType.IsGenericType && serverType.Name.StartsWith("Nullable") && typeof(Nullable<>).MakeGenericType(serverType.GenericTypeArguments) == serverType) { serverType = serverType.GenericTypeArguments[0]; }

            modelMetadata.AdditionalValues.Add("ServerType", serverType.AssemblyQualifiedName);

            SetTemplateHint(modelMetadata);
            SetCustomAttributes(attributes, modelMetadata, modelType, propertyName);
            SetResourceStrings(modelMetadata);

            return modelMetadata;
        }
       ....
}

...这里的关键是我为给定类型提取模型元的基本副本,然后以我自己的自定义方式对其进行操作(其中一些在上面的示例中显示)。

我把剩下的删掉了,因为有很多。

最终结果是,从我自己的基本通用控制器中,我有一个看起来像这样的动作......

protected MetadataContainer GetMetadataForType(Type type)
{
         return new MetadataContainer(MetaProvider.GetMetadataForType(null, type));
}

然后,控制器通常会根据此做出决策。

我希望重现这种行为,关键是能够从堆栈中获取“最终元”的定制版本(我从中收集:https://github.com/aspnet/Mvc/issues/2522 ...该元现在是一个“链提供者”以某种方式)。

所以我有几个问题......

如何在给定类型的元信息中添加或删除/更新自定义“属性”/属性? 在所有提供程序都已执行后,如何获得堆栈视为“最终结果”的元实例? 现有的解决方案经常将此元信息传递给客户端 JS 代码,以允许在浏览器中“动态组件构建”,这是一个具有任何形式的最佳实践的场景,我可以从中收集更多建议(也许你们有一篇博文或什么让我开始)?

【问题讨论】:

    标签: asp.net-core-mvc metadata asp.net-core-webapi


    【解决方案1】:

    最后答案很简单...... 不用费心去做这些,建立一个反射派生信息的缓存,然后在控制器中提供它。

    这基本上只是意味着这是提取所需相关类型信息的简单反射代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多