Implement registration in domain model
UserService
 that RegistrationApiController
depends on is very thin because its responsibility only includes the following:
- Coordinating tasks on the models
- Guarding the domain model with security constraints
- Controlling transactions
Most importantly, its responsibility should not involve any business logic. Business logic should only live in the domain models. Figure 9.11 shows the relationship between UserService
and its dependencies:
Figure 9.11: UserService class diagram
As you can see, the implementation of UserService
, which is UserServiceImpl
, relies on RegistrationService
, which is a Domain Service to handle the actual registration. It also relies on MailManager
to send email and DomainEventPublisher
to publish the UserRegisteredEvent
 domain event.
Implement the UserService application service
As mentioned, Application Services should be kept thin. They can hold references to their dependencies, such as Repositories, Domain Services, and Infrastructure...