Saltar al contenido principal

Domain events

Utilidad

Para poder utilizar eventos de dominio en esta arquitectura debes instalar nuestro paquete que permitirá hacer dispatch de los eventos que vayan ocurriendo en la aplicación. El uso de eventos de dominio es una excelente estrategia para desacoplar acciones que deben ejecutarse ante un determinado evento en nuestra aplicación.

Instalación

npm i --save @codescouts/events

Dependencias

  • No tiene

Ahora lo que deberás hacer es inyectarlo como dependencia en tus casos de uso para poder hacer el dispatch cuando lo deseeas

Ejemplo de dispatch

import { IEventDispatcher } from "@codescouts/events";

import { Log } from "@domain/model/Log";
import { NewLogRegistered } from "@domain/events/NewLogRegistered";

export class TestUseCase {
constructor(private readonly dispatcher: IEventDispatcher) {

}

public execute(message: string) {
const log = new Log(message);

this.dispatcher.dispatch(new NewLogRegistered(log));
}
}

La dependencia de esta interface dependerá de la aplicación que utilices. Pero si hablamos concretamente de React podrás utilizar nuestro paquete de UI, que tiene una implementación utilizando Hooks que te permitirá usarlos.

Ejemplo del evento

import { DomainEvent } from "@codescouts/events";
import { Log } from "../model/Log";

export class NewLogRegistered extends DomainEvent {
constructor(public readonly log: Log) {
super();
}
}

Ejemplo del handler

import { Handler } from "@codescouts/events";
import { NewLogRegistered } from "./NewLogRegistered";

export class NewLogRegisteredHandler extends Handler<NewLogRegistered> {
public constructor() {
super(NewLogRegistered);
}

protected handle(event: NewLogRegistered): void | Promise<any> {
const message = `New log registered ${event.log.format()}`;

setTimeout(() => {
alert(message);
}, 1000);
}
}

Implementación en React

Primero debes instalar nuestro paquete de UI que tiene la implementación necesaria para que puedas instanciar tu caso de uso con el IEventDispatcher

npm i --save @codescouts/ui

Puedes instanciar a mano tu caso de uso de esta manera, aunque también puedes utilizar inyección de dependencias si así lo deseas Dependency injection

export const Foo = ()=> {
const dispatcher = useEventDispatcher();
const useCase = new TestUseCase(dispatcher);

useCase.execute("Test");

return <>Hi</>
}

Aún no terminamos, ya que en tu aplicación React tendrás que ejecutar el hook de useEvents así 👇 para que tu aplicación registre los Handlers del los DomainEvents que tienes.

import { BrowserRouter, Route, Routes } from "react-router-dom";
import { useEvents, DependencyInjectionContainer } from "@codescouts/ui";

import { NewLogRegisteredHandler } from "@domain/events";

import { Header } from "@ui/components";
import { Home } from "@ui/pages";

const App = () => {
useEvents(() => {
new NewLogRegisteredHandler();
});

return (
<BrowserRouter>
<div className="app">
<Header />
<Routes>
<Route path="/" element={<Home />} />
</Routes>
</div>
</BrowserRouter>
);
};

export default App;

Lo único que tienes que hacer es instanciar el tu Handler dentro del useEvents

No hace falta aclarar, pero lógicamente aquí es donde registrarás todos tus handlers, incluso te recomendamos que puedas generarte una función que registre todos los handlers, y aquí referenciarla.

nota

Si necesitas pasarle al handler la implementación de un hook, primer debes ejecutar el hook fuera del useEvents y pasarle la referencia

export const Foo = ()=> {
useEvents(()=> {
new YourHandler(useBar())
})


const bar = useBar();

useEvents(()=> {
new YourHandler(bar)
})
}