# Overview

This section explains the fundamental building blocks of the Hermodr framework.

## Overview

```
┌──────────────────────────────────────────────────────┐
│                   Your application                   │
│                                                      │
│   ┌──────────────┐      ┌──────────────────────────┐ │
│   │  Event data  │─────▶│      EventPublisher      │ │
│   │  (annotated  │      └──────────┬───────────────┘ │
│   │   classes)   │                 │ fan-out         │
│   └──────────────┘        ┌────────┴────────┐        │
│                           │                 │        │
│                   ┌───────▼─────┐   ┌───────▼──────┐ │
│                   │  Channel A  │   │  Channel B   │ │
│                   │ (Azure SB)  │   │  (Webhook)   │ │
│                   └─────────────┘   └──────────────┘ │
└──────────────────────────────────────────────────────┘
```

1. You describe an event using an annotated data class (or construct a raw `CloudEvent`).
2. You call `EventPublisher.PublishAsync` (or `PublishEventAsync`).
3. The publisher fans the event out to **every registered `IEventPublishChannel`**.
4. Each channel serialises the event and dispatches it to the appropriate transport.

## Key Abstractions

| Abstraction                 | Role                                                                                                     |
| --------------------------- | -------------------------------------------------------------------------------------------------------- |
| `EventPublisher`            | The single entry point for publishing events                                                             |
| `IEventMiddleware`          | A composable step in the publish pipeline (enrichment, validation, observability, …)                     |
| `EventContext`              | Carries the current event, scoped services, options, and a data-sharing `Items` bag through the pipeline |
| `IEventPublishChannel`      | One transport target (Azure Service Bus queue, RabbitMQ exchange, …)                                     |
| `IBatchEventPublishChannel` | A channel that also supports delivering multiple events in a single batched call                         |
| `IEventFactory`             | Converts an annotated data object into a `CloudEvent`                                                    |
| `IEventIdGenerator`         | Generates unique identifiers for events (default: GUID)                                                  |
| `IEventSystemTime`          | Supplies the event timestamp (replaceable for testing)                                                   |
| Keyed `IEventPublisher`     | Resolves a named publisher pipeline by name at runtime                                                   |

## Pages in this section

* [CloudEvents Standard](/core-concepts/cloudevents.md)
* [Event Publisher](/core-concepts/event-publisher.md)
* [Event Creation](/core-concepts/event-creation.md)
* [Publish Pipeline & Middleware](/core-concepts/publish-pipeline.md)
* [Publish Channels](/core-concepts/publish-channels.md)
* [Event Annotations](/core-concepts/event-annotations.md)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hermodr.deveel.org/core-concepts/concepts.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
