Tak żeby potraktować ten temat jako skarbnicę pytań i odpowiedzi to mam pytanie:
Mam załóżmy agregat Order
, pod niego mam jakiś OrderHandler
- który odpowiada za publikowanie eventów, no i jakiś "recreate" agregatu na podstawie eventów z event store.
Teraz pytanie, bo mamy takowy OrderHandler
, który wygląda tak:
@Repository
public class OrderHandler {
private final MongoTemplate mongoTemplate;
public OrderHandler(final MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
public void publish(final DomainEvent event) {
mongoTemplate.insert(event, "events");
}
}
No i załóżmy, że teraz przy evencie OrderPlaced
ma iść e-mail do usera z potwierdzeniem zamówienia. Oczywiście mój EmailSender
jest to całkowicie wydzielony moduł, uniwersalny dla pozostałych. Mam w planach wysyłać po prostu za pomocą Kafka Streams DTO z danymi e-maila do tego drugiego modułu - reagowałby on automatycznie przy evencie OrderPlaced
generując jeszcze jakiś "event" typu EmailSent
, który leciałby Kafką do innego modułu.
No i tutaj jak to ograć? Zostawić OrderHandler
jako abstrakcje, która będzie mi odpowiadała tylko za kontakt z Event Store, a wyżej dodać abstrakcję, która wykona mi całą pozostałą magię, czyli coś na zasadzie:
class OrderPlacer {
private final OrderHandler handler;
private final ConfirmationEmailCreator creator;
void placeOrder(PlaceOrder placeOrder) {
orderHandler.handler(OrderPlaced.builder().///dane///
.build());
confirmationEmailCreator.create(//tu przekaże dane, które będą potrzebne (adresat, treść itp.)); // i w środku wyślę jakimś Sourcem ten zbudowany wewnątrz DTO do modułu odp. za wysyłkę emaili?
}
}