Это все отличные вопросы. Возможность определить, какие из них следует использовать, зависит от вашего опыта и проблемы, над которой вы работаете.
Я бы предложил почитать книгу типа корпоративной архитектуры Фаулера . В этой книге он обсуждает шаблоны, которые вы упоминаете. Наиболее важно, хотя он назначает каждому шаблону ответственность . Например, логика домена может быть размещена либо на уровне службы, либо на уровне домена. Есть плюсы и минусы, связанные с каждым.
Если я решу использовать уровень Сервиса, я назначу ему роль обработки транзакций и авторизации. Мне нравится держать это "тонким" и не иметь никакой доменной логики там. Это становится API для моего приложения. Я сохраняю всю бизнес-логику с доменными объектами. Это включает в себя алгоритмы и проверки для объекта. Хранилище извлекает и сохраняет доменные объекты. Это может быть взаимно-однозначное соответствие между столбцами базы данных и свойствами домена для простых систем.
Я думаю, что GetAtcitveUsers подходит для репозитория. Вам не нужно извлекать всех пользователей из базы данных и выяснять, какие из них активны в приложении, так как это приведет к снижению производительности. Если ActivateUser имеет бизнес-логику, как вы предлагаете, то эта логика принадлежит объекту домена. За сохранение изменений отвечает слой Repository.
Надеюсь, это поможет.