Regel 1: Domain darf Spring nicht importieren
Warum
Domain wird frameworkabhaengig
Falsch
import org.springframework.stereotype.Service;
@Service
public class Order { }
Richtig
public final class Order {
// keine Framework-Annotationen
}
Pruefung
grep -R "org.springframework" maven-project/domain/src || true
Regel 2: Application kennt keine JDBC-Klassen
Warum
Use Case wird Infrastrukturcode
Falsch
public class AcceptOrderUseCase {
private JdbcTemplate jdbc;
}
Richtig
public class AcceptOrderUseCase {
private final OrderRepository orders;
}
Pruefung
grep -R "org.springframework" maven-project/domain/src || true
Regel 3: Adapter implementiert Port
Warum
Infrastruktur wird austauschbar
Falsch
public class JdbcOrderRepository { }
Richtig
public final class JdbcOrderRepository implements OrderRepository {
public void save(Order order) { }
}
Pruefung
grep -R "org.springframework" maven-project/domain/src || true
Regel 4: Runtime ist Composition Root
Warum
Verdrahtung verteilt sich nicht in Domain
Falsch
new JdbcOrderRepository(new JdbcTemplate())
Richtig
@Bean
AcceptOrderUseCase useCase(OrderRepository repo) {
return new AcceptOrderUseCase(repo);
}
Pruefung
grep -R "org.springframework" maven-project/domain/src || true
Regel 5: Events brauchen Idempotency
Warum
Consumer verarbeitet doppelt
Falsch
public void onEvent(String payload) {
createInvoice(payload);
}
Richtig
if (processedEvents.markIfNew(eventId)) {
createInvoice(payload);
}
Pruefung
grep -R "org.springframework" maven-project/domain/src || true
Regel 6: API Fehler brauchen stabile Codes
Warum
Client sieht zufaellige Exceptions
Falsch
throw new RuntimeException("boom");
Richtig
throw new BusinessException("ORDER_PAYMENT_TIMEOUT");
Pruefung
grep -R "org.springframework" maven-project/domain/src || true
Regel 7: Secrets gehoeren nicht in Git
Warum
Passwoerter landen im Repository
Falsch
password: supersecret
Richtig
password: ${POSTGRES_PASSWORD}
Pruefung
grep -R "org.springframework" maven-project/domain/src || true
Regel 8: Health Checks muessen aussagekraeftig sein
Warum
Pod ist gruen, obwohl DB tot
Falsch
return UP;
Richtig
return dbReachable ? UP : DOWN;
Pruefung
grep -R "org.springframework" maven-project/domain/src || true