Skip to content

Stateless context (no persistence)

A DomainModule can have only commands and queries, with no aggregate and no repository. Use this for bounded contexts that do not store state in a database: calculators, validators, external API gateways, etc.

Example

from dataclasses import dataclass
from urich.ddd import DomainModule, Command, Query


@dataclass
class CalculateCommission(Command):
    amount_cents: int
    rate_percent: float


@dataclass
class ValidateRule(Query):
    rule_id: str
    payload: dict


def calculate_commission_handler(cmd: CalculateCommission) -> int:
    return int(cmd.amount_cents * cmd.rate_percent / 100)


def validate_rule_handler(query: ValidateRule) -> dict:
    # Your validation logic; no repository needed
    return {"valid": True, "rule_id": query.rule_id}


# Module with no .aggregate() and no .repository()
commission_module = (
    DomainModule("commission")
    .command(CalculateCommission, calculate_commission_handler)
    .query(ValidateRule, validate_rule_handler)
)

app.register(commission_module)

Handlers receive only the command/query (and any dependencies you register via .bind()). No repository or EventBus is required unless you add .repository() or .on_event().