Техника для переноса метаданных для просмотра моделей с помощью AutoMapper
==========================================================================

Я использую AutoMapper для сопоставления моих доменных объектов с моими моделями представления. У меня есть метаданные в моем доменном слое, которые я хотел бы перенести на слой представления и в ModelMetadata. (Эти метаданные не являются логикой пользовательского интерфейса, но предоставляют необходимую информацию для моих представлений).

Прямо сейчас мое решение состоит в том, чтобы использовать отдельный MetadataProvider (независимо от ASP.NET MVC) и использовать соглашения для применения соответствующих метаданных к объекту ModelMetadata через AssociatedMetadataProvider. Проблема с этим подходом заключается в том, что при связывании ModelMetadata из домена мне приходится тестировать те же соглашения, что и при использовании автоматического сопоставления, и, похоже, должен быть способ сделать это более ортогональным. Кто-нибудь может порекомендовать лучший способ сделать это?

 чтобы автоматически копировать аннотации данных из моих сущностей в мою модель представления. Это гарантирует, что такие вещи, как StringLength и Required, всегда будут одинаковыми для entity / viewmodel.

Он работает с использованием конфигурации Automapper, поэтому работает, если свойства именуются в модели представления, если AutoMapper настроен правильно.

Вам нужно создать пользовательский ModelValidatorProvider и пользовательский ModelMetadataProvider, чтобы это работало. Моя память о том, почему это немного туманно, но я считаю, что это так и на стороне сервера, и на стороне клиента, а также любое другое форматирование, которое вы выполняете на основе метаданных (например, звездочка рядом с обязательными полями).

Примечание. Я немного упростил свой код, добавив его ниже, поэтому может возникнуть несколько небольших проблем.

**Поставщик метаданных**

**Валидатор Провиддер**

**Вспомогательный метод, указанный в 2 классах**

**Другие заметки**

Если вы используете внедрение зависимостей, убедитесь, что ваш контейнер еще не заменяет встроенный поставщик метаданных или поставщик валидатора. В моем случае я использовал пакет Ninject.MVC3, который связал один из них после создания ядра, и мне пришлось потом перепривязывать его, чтобы мой класс фактически использовался. Я получал исключения из-за того, что Required разрешено добавлять только один раз, и большую часть дня я занимался его поиском.

[MetaDataTypes](https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute.metadatatypeattribute.aspx)затем примените один и тот же MetaDataType к классу вашего домена и к вашим моделям представления. Вы можете определить все MetaDataTypes в отдельной DLL, которая является ссылкой на оба слоя. Есть некоторые проблемы с этим подходом, если ваши классы ViewModel не имеют некоторых свойств, которые используются в MetaDataType, но это можно исправить с помощью специального провайдера (у меня есть код, если вам нравится этот подход).



расширил эту идею, чтобы включить проверку, предоставляемую IValidatableObject.

Затем в Global.asax.cs: