Índice |
---|
No C# uma classe pode definir comportamentos a serem disparados quando determinada ação acontece. Esses comportamentos podem ser assinados para que quando ocorram alguém seja notificado.
O TNF contém suporte ao um pattern chamado Domain Event.
...
.
...
Eventos ocorrem de forma assíncrona não interrompendo o fluxo normal de seu código dando mais flexibilidade distribuindo-as melhor quando não existe a necessidade de esperar que um processo seja finalizado.
...
Não precisamos esperar o envio do e-mail para que o cadastro seja finalizado. Neste caso o envio do e-mail é um processo secundário que pode ser implementado através do um evento de domínio.
No TNF encontramos suporte ao um pattern chamado Domain Event.
Para usar a estrutura de Domain Events instale o pacote Tnf via nuget disponível em: https://www.myget.org/F/tnf/api/v3/index.json
EventBus é um objeto registrado como singleton no TNF que é compartilhado na aplicação para que seja usado para manipular e controlar os eventos.
...
A primeira classe chamada NewRegistrationHandler contém a implementação do comportamento do evento. Toda vez que o evento for disparado essa classe será chamada. Desta forma observe que a interface ITransientDependency ITransientDependency (injeção de dependência através de convenções) está presente por este motivo. Esse evento é transitório e será criado para cada cadastro criado no sistema.
...
Na classe abaixo o evento é disparado dentro do serviço de domínio onde é feita a injeção do EventBusda interface IEventBus:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
using Tnf.Architecture.Domain.Events; using Tnf.Architecture.Domain.Interfaces.Services; using Tnf.Domain.Services; using Tnf.Dto; using Tnf.Events.Bus; namespace Tnf.Architecture.Domain.Registration { public class RegistrationService : DomainService<IPersonRepository>, IRegistrationService { private readonly IEventBus _eventBus; public RegistrationService(IPersonRepository repository, IEventBus eventBus) : base(repository) { _eventBus = eventBus; } public DtoResponseBase<PersonDto> Register(PersonDto dto) { var response = new DtoResponseBase<PersonDto>(); var builder = new PersonBuilder() .WithName(dto.Name); var build = builder.Build(); if (!build.Success) { response.AddNotifications(build.Notifications); return response; } var id = Repository.CreatePerson(dto); dto.Id = id; // Trigger event before create person _eventBus.Trigger(new NewRegistrationEventData(dto)); return response; } } } |
Observe que após o objeto de domínio ser construído e passar por todas as validaçõesestar valido, o repositório é consumido cadastrando um novo dado, fazendo o disparo do evento através da interface IEventBus injetada em nosso serviço de domínio.
O método Trigger da interface IEventBus recebe o dado do evento representando a sua estrutura.
Nesse momento o Handler implementado anteriormente será chamado e executado.