Правильное использование DataAnnotations в приложении ASP.NET MVC с классами домена в отдельном проекте?
У меня есть N-уровневое приложение, в котором Data, Domain и интерфейсные слои находятся в отдельных проектах. Я использую ASP.NET MVC для создания веб-сайта и пытаюсь добавить правила проверки с использованием System.ComponentModel.DataAnnotations. В настоящее время я сделал это на свойствах классов домена. Я хотел бы знать, является ли хорошей практикой применение правил проверки непосредственно к классам домена? Или лучше создать классы ViewModels в приложении ASP.NET и применить правила проверки к свойствам классов ViewModel? Надеюсь, что этот вопрос подходит здесь, я ценю любую помощь.
2 ответа
ViewModel намного лучше, потому что ViewModel должен понимать, получает ли он действительные данные от пользователя. И тогда вы можете исправить все другие исключения во время преобразования с помощью AutoMapper. Я также хотел бы создать множество пользовательских DataAnnotations, DataTypes, Editors, ModeMetaDataRules и ModelBinder для использования с приложением.
Вот части кода для ModelFilter, использующего пользовательский ModelBuilder, я собираюсь опубликовать его часть, потому что в нем много кода, но он должен помочь вам в правильном направлении.
public interface IModelMetadataFilter
{
void TransformMetadata(ModelMetadata metadata,
IEnumerable<Attribute> attributes);
}
public class MultilineTextByNameConvention : IModelMetadataFilter
{
public void TransformMetadata(ModelMetadata metadata, IEnumerable<Attribute> attributes)
{
if ( !string.IsNullOrEmpty(metadata.PropertyName) &&
string.IsNullOrEmpty(metadata.DataTypeName) )
{
if ( metadata.PropertyName.ToLower().Contains("notes")
|| metadata.PropertyName.ToLower().Contains("description")
|| metadata.PropertyName.ToLower().Contains("comment")
)
{
metadata.DataTypeName = DataType.MultilineText.ToString();
}
}
}
}
Этот код ищет каждую ViewModel с именем свойства, содержащим слова 'notes', 'description' и 'comment', автоматически применяя атрибут Multitext DataType для всех этих свойств. Этот тип кода может использоваться для многих других различных ситуаций. Например, поля типа SSN могут иметь определенный формат, используя RexExpr DataAnnotation и т. Д.
Вы можете установить атрибуты для частичных классов ваших сущностей, и ваши автоматически сгенерированные классы не будут переопределены.
Например,
Допустим, у вас есть сущность TheEntity
В отдельном файле с тем же пространством имен вы можете написать:
namespace SameNamespaceAsEntities
{
internal sealed class TheEntityMetadata
{
//AStringInTheEntity appears twice in your project
//once in the auto gen file, and once here
[Required(ErrorMessage = "Field is required.")]
public string AStringInTheEntity{ get; set; }
}
//http://stackru.com/questions/14059455/adding-validation-attributes-with-an-entity-framework-data-model
[System.ComponentModel.DataAnnotations.MetadataType(typeof(TheEntityMetadata))]
public partial class TheEntity : IEntity //you can set contracts
{