Пробую применить DDD к сервису авторизации.
Если пользователь (User) это основная сущность агрегата, то токены это его внутренние сущности и он как-то должен ими управлять и их проверять. Значит ему нужно получать доступ к хранилищу. Помимо хранилища есть необходимость в других функция, например
IHashProvider, ITokenProvider для хеширования и проверки пароля, генерации токенов.
Вопрос в том как запихнуть это всё в User незаметно для уровня приложения?
При создании нового пользователя можно сделать фабрику и через рефлекию использовать приватный метод
static User New( string email, string name, string password, IHashProvider hashProvider, IUserRepository repo )
return (User)typeof( User )
.GetMethod( "New" )
.Invoke( null, new object[] { email, name, password, _hashProvider, _repository } );
Но в ропозитории тоже надо как-то подсовывать все эти зависимости, можно тогда засунуть фабрику в репозитории, но если фабрика в доменном слое и они знает про то как правильно инитить пользователя это норм, но репозиторий это инфраструктура и мне видится это не совсем правильным.
Есть какие-то известные практики таких инициализаций сущностей или что в моем понимании DDD не так ?