Понимание метаданных в ядре aspnet - PullRequest
0 голосов
/ 08 июля 2019

Меня перенаправили отсюда: 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-коду для «динамического конструирования компонентов» в браузере. Это сценарий, в котором есть какая-либо лучшая практика, из которой я могу получить больше советов (возможно, у вас, ребята, есть запись в блоге).или что-то, чтобы начать меня)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...