Два числа действительно в разных моделях - модель запроса и модель предметной области. Перечитывая вопрос и мой первоначальный ответ, я думаю, что вижу здесь несоответствие.
Проверка внешнего интерфейса должна быть ограничена основными типами данных. Если вы ожидаете целое число, убедитесь, что вызывающая сторона отправила целое число, даты - это даты, а строки - это строки. Это ответственность Контроллера (или любого другого, который получает запрос непосредственно от пользователя). Если пользователь отправляет недопустимое целое число, оно отклоняется на этом уровне. Здесь не выполняется проверка диапазона, мы проверяем только правильность запроса.
Затем контроллер создает команду. Роль Команды - донести желание пользователя до логики домена, которая выполняет бизнес-логику для выполнения этого желания. Мы предполагаем, что пользователь действительно хочет создать ученика с заданным номером, поэтому команда должна сообщить об этом желании в домен, то есть в команде не должно быть проверки диапазона. Проверка команд обычно выполняется только с помощью аргументов конструктора соответствующего типа.
Логика домена пытается выполнить желание пользователя и создать нового ученика с недействительным номером. Домен решает, что это недопустимое число, и выдает исключение на этом уровне, что приводит к сбою выполнения Команды. Контроллер распознает сбой выполнения команды и возвращает соответствующий сбой вызывающей стороне (или, если выполнение команды асинхронно, обрабатывает ошибку соответствующим образом).
Ваш первоначальный инстинкт был верным, что вы нарушали DRY. Это можно показать, изменив бизнес-правило, чтобы расширить его диапазон. Это единственное изменение бизнес-правила потребует двух изменений кода, что доказывает, что вы повторяли себя.