Обязательный атрибут для примитивных типов не имеет смысла - PullRequest
2 голосов
/ 10 апреля 2019

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

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

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

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

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

1 Ответ

1 голос
/ 12 апреля 2019

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

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

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

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

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

...