Обязательный атрибут для примитивных типов не имеет смысла

2

В моем случае использования мне нужно обязательное логическое свойство, например:

public class Todo 
{ 
    [Required] 
    public bool IsDone {get; set; } 
}

Я столкнулся с ошибкой в моем проекте Entity Framework из-за отсутствия сопоставления свойства (значение не было установлено) логического свойства. В результате я всегда сохранял логическое значение по умолчанию 'false, в то время как оно на самом деле не заполнено. Когда оно не заполнено, я ожидаю выдать исключение проверки, но поскольку его примитивный тип, атрибут проверки не имеет смысла, поскольку он всегда имеет значение по умолчанию, которое достаточно, чтобы пройти. Я не хочу иметь значение по умолчанию, и атрибут validation должен выдавать исключение, когда значение не установлено.

Решение, которое я придумала, состоит в том, чтобы использовать обнуляемые логические значения с обязательным атрибутом. Если свойство не задано, обязательный атрибут выдаст исключение, что здорово. С другой стороны, довольно странно иметь обязательный логический тип, допускающий значение NULL, потому что вы знаете, что он всегда заполнен (из-за обязательного атрибута), и это делает бизнес-логику об этом свойстве менее читаемой (IsDone.HasValue? IsDone.Value: false;/Не должно быть возможно, потому что это требуется /).

Возможны ли другие решения?

  • 0
    IsDone == true и IsDone == false довольно читабельны.
Теги:
entity-framework
asp.net-web-api
data-annotations

1 ответ

0

Здесь есть несколько вариантов. То, что вы хотите, это механизм тройного состояния: не установлено, истина, ложь

Nullable bool действительно обеспечивает это, однако главный вопрос заключается в том, понятно ли это потребителям.

Второй вариант - создать тройное перечисление состояний и использовать его вместо этого.

  • Это понятнее? Может быть
  • Это расширяемое? Да, но действительно ли нам требуется более 3 штатов?

Между этими двумя я бы сам пошел с обнуляемым булом. В конце концов, вы можете выбрать свой тип ситуации.

  • 0
    Спасибо за ваш комментарий. Действительно может быть альтернативным решением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню