Después de un tiempo descubrí la solución, de los votos positivos creo que otros están enfrentando el mismo problema, aquí está la solución:
Pregunta: ¿Podemos activar una invocación explícita para los eventos de dominio?
Respuesta: Sí, podemos. En SpringBoot
podemos usar / Autowire
la ApplicationEventPublisher
interfaz y luego llamar al publishEvent(event)
método.
Si está creando una clase separada para la colección Db y Aggregate, necesitará exponer su DomainEvents
método y un método para ClearingDomainEvents
su agregado, ya que AbstractAggregateRoot<T>
tiene estos métodos como protected
. A continuación se muestra un ejemplo de cómo generar un evento en la creación:
public class MyAggregateRootClass extends AbstractAggregateRoot<MyAggregateRootClass>
{
public MyAggregateRootClass(String property1, String property2) {
// set the fields here
registerEvent(new MyAggregateRootCreated(someArgs));
}
public Collection<Object> getDomainEvents() {
return super.domainEvents();
}
public void clearDomainEvents() {
super.clearDomainEvents();
}
}
El código del repositorio se vería así:
@Repository
@RequiredArgsConstructor // using lombok here, you can create a constructor if you want
public class MyAggregateRepository {
private final ApplicationEventPublisher eventPublisher;
private final AggregateMongoRepository repository;
public void save(MyAggregateRootClass aggToSave) {
AggregateDao convertedAgg = new AggregateDao(aggToSave);
repository.save(convertedAgg);
// raise all the domain events
for (Object event : aggToSave.getDomainEvents())
eventPublisher.publishEvent(event);
// clear them since all events have been raised
aggToSave.clearDomainEvents();
}
}
Entonces, ¿eso significa que generalmente no deberíamos hacer dos clases diferentes, una como AggregateRoot
y otra como Clase de documento para almacenar raíces agregadas mongoDB
?
Respuesta : No, eso no significa eso. El objetivo de la DDD
sería separarse infrastructure
de Domain
y mantener el carácter Domain
agnóstico de todo el código de infraestructura. Si ambos son iguales, a continuación se muestra el impacto:
- Tener la
@Document
anotación en su Aggregate Class
lo haría cambiar su Domain
si está cambiando marcos o intercambiando Mongodb
con SQL
.
- En el futuro, en caso de que su esquema de base de datos necesite cambiar, tendrá que cambiar también su clase agregada o tendrá que configurar las clases de adaptador.
- Dado que el dominio solo debería cambiar si hay un cambio en los requisitos comerciales y no debido a eso
infrastructure dependencies
, infrastructure annotations
ingresar al sitio AggregateRoot
no sería la mejor manera
Entonces, ¿cuándo puede salirse con la suya usando la misma clase para Aggregate y Db Collection?
Si desea mantenerlo simple y usar la misma clase para ambos y no crear una clase separada, asegúrese de estar seguro de lo siguiente:
- Si está absolutamente seguro de que nunca cambiará las bases de datos ni los marcos.
- Tiene un simple modelo de dominio y que no es necesario para almacenar
Entities
el Aggregate
en una recogida selectiva y que no hay ninguna posibilidad de que los Entities
volvería a crecer en su propioAggregates
Al final depende. Siéntase libre de dejar comentarios y haré todo lo posible para responderlos a todos, bastante activo en la pila.