При использовании аннотаций данных с MVC, за и против использования интерфейса и типа метаданных

Если вы прочитали эту статью о валидации с помощью валидаторов аннотаций данных , это показывает, что вы можете использовать атрибут MetadataType для добавления атрибутов валидации к свойствам в частичных классах. Это используется при работе с ORM, такими как LINQ to SQL, Entity Framework или Subsonic. Затем вы можете использовать «автоматическую» проверку на стороне клиента и сервера. Он очень хорошо играет с MVC.

Однако, мой коллега использовал интерфейс для достижения точно такого же результата. это выглядит почти точно так же, и функционально выполняет то же самое. Поэтому вместо того, чтобы делать это:

[MetadataType(typeof(MovieMetaData))]
public partial class Movie
{
}

public class MovieMetaData
{
    [Required]
    public object Title { get; set; }

    [Required]
    [StringLength(5)]
    public object Director { get; set; }


    [DisplayName("Date Released")]
    [Required]
    public object DateReleased { get; set; }
}

Он сделал это:

public partial class Movie :IMovie
{
}

public interface IMovie
{
    [Required]
    object Title { get; set; }

    [Required]
    [StringLength(5)]
    object Director { get; set; }


    [DisplayName("Date Released")]
    [Required]
    object DateReleased { get; set; }
}

Итак, мой вопрос, когда эта разница на самом деле имеет значение?

Я думаю, что интерфейсы имеют тенденцию быть более «многократно используемыми», и что создание интерфейса для одного класса не имеет особого смысла. Вы также можете утверждать, что вы могли бы проектировать свои классы и интерфейсы таким образом, чтобы вы могли использовать интерфейсы для нескольких объектов, но я чувствую, что пытаюсь приспособить ваши модели к чему-то другому, когда они действительно должны стоять самостоятельно. Что ты думаешь?

10
задан John Bubriski 31 March 2010 в 17:55
поделиться

3 ответа

Мне нравится ваш интерфейсный подход, поскольку он позволяет вам определять контракт для вашей модели, который вы можете использовать для адаптации ваших классов, сгенерированных ORM. Это позволит вам отделить ваше приложение от инфраструктуры ORM и получить больше пользы от интерфейса MetadataType, поскольку он служит метаданными для проверки данных, а также контрактом для вашей модели. Вы также можете украсить свой интерфейс атрибутами сериализации для использования в WCF, чтобы получить больше пользы от интерфейса. Я следил за несколькими ранними блогами, в которых рекомендовалось создать класс метаданных, но, опять же, я считаю, что интерфейсное решение - хорошая идея.

3
ответ дан 4 December 2019 в 03:16
поделиться

Я не вижу функциональной разницы между двумя подходами. Я не уверен, что здесь действительно важна возможность повторного использования, учитывая, что проверка чаще всего будет проводиться на «одноразовых» моделях представления, которые, вероятно, не получат много повторного использования, если вообще будут.

1
ответ дан 4 December 2019 в 03:16
поделиться

Если бы мне представили эти два варианта, я бы лично, вероятно, выбрал способ интерфейса, просто потому что я думаю, что он выглядит чище. Но это полностью основано на личном вкусе - я не знаю достаточно о внутренней работе .NET, чтобы сказать наверняка, но я не знаю ни одного случая, когда фактическая функциональность этих двух подходов отличалась бы.

С другой стороны, гораздо лучшим подходом было бы использование объектов передачи данных (DTO) для отправки данных туда и обратно, и предъявление к ним требований проверки. То есть вместо того, чтобы требовать, чтобы объект Movie отвечал всем требованиям проверки, вы требуете, чтобы объект MovieInput отвечал всем этим требованиям, а затем создаете код для отображения правильного MovieInput в Movie. (Если вы не хотите делать это вручную, вы можете использовать AutoMapper или какую-нибудь другую утилиту).

Концепция заключается в том, чтобы иметь что-то вроде объекта View Model на пути in так же, как и на пути out - я мог бы с таким же успехом позволить MovieInput называться MovieViewModel и использовать его для передачи данных как внутрь, так и наружу сервера.

2
ответ дан 4 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: