Репозитории обычно находятся на более высоком уровне абстракции, чем доменные объекты, которые они выбирают / хранят. Если вы обнаружите, что ваши доменные объекты зависят от репозиториев, это свидетельствует о проблемах проектирования в восходящем направлении.
То, что у вас есть, это круговая зависимость. IUserRepository
зависит от User
, а User
зависит от IUserRepository
. Это технически работает, в том смысле, что оно будет компилироваться, если оба объекта находятся в одной сборке, но это приведет к неприятностям в качестве общего проекта. Могут быть всевозможные объекты, которые хотят иметь дело с User
, но ничего не знают о IUserRepository
, откуда он взялся.
Я предлагаю вам не делать это «валидационным» свойством User
. Проверка должна выполняться самим хранилищем, или, что еще лучше, просто заставьте хранилище вызвать исключение, если имя пользователя уже существует, когда оно пытается сохранить.
Есть вторичная причина для этого предложения. Эта причина - параллелизм. Даже если вы подтвердите имя пользователя и обнаружите, что оно не уже существует, это может оказаться неверным через 1 секунду, когда вы попытаетесь сохранить этого пользователя. Поэтому вам нужно обработать исключительный случай (попытался вставить имя пользователя, которое уже существует) в любом случае . Учитывая это, вы также можете отложить это до последнего возможного момента, поскольку у вас нет возможности заранее дать гарантии.
Объекты домена должны иметь никаких зависимостей; если они самоутверждаются, то проверка должна зависеть только от фактического объекта, который проверяется, а не от других данных в базе данных. Ограничение на дублирование имени пользователя на самом деле является ограничением данных, а не ограничением домена.
Резюме: Переместите эту конкретную проверку за пределы User
класса. Это не принадлежит там; вот почему вы используете именно этот анти-шаблон.