Признак хорошего тона — не делать ничего в конструкторе кроме того, что необходимо. А все, что необходимо, — это проверять предоставленные аргументы, а затем присваивать их в качестве значения для свойств сервиса.
Никогда не передавайте потенциально изменяемый объект клиенту, которому не разрешено его менять. Даже если клиент не изменит его прямо сейчас, однажды он все же может это сделать, и тогда будет трудно выяснить, что произошло.
Сервис должен быть неизменяемым снаружи и изнутри. Как и с сервисами для извлечения данных, необходимо обеспечить возможность многократного использования сервисов для выполнения задач. Если что-то пойдет не так при выполнении задачи, выдавайте исключение (как только о проблеме станет известно).
Командные методы должны использоваться для выполнения задач. Этим методам необходимо присваивать названия в форме императива («сделай это», «сделай то»), и область их воздействия должна быть ограничена. Выделяйте основную задачу и второстепенные. Передавайте события, чтобы другие сервисы могли выполнять дополнительные задачи. Пока эти задачи выполняются, командный метод может совершать вызовы методов-запросов, чтобы получать любую необходимую информацию.
Если в командном методе имеется код, который взаимодействует с частями приложения, находящимися за границами самого приложения (например, используются удаленный сервис, файловая система, системное устройство и т.п.), нужно создать абстракцию.