The layer-by-layer dependency setup is clear, but I'm curious about how you handle cross-cutting concerns like logging and caching — do those live in the infrastructure layer or get injected through the application contracts? In larger .NET projects I've seen the application layer grow unwieldy when every cross-cutting concern routes through the same abstraction boundary.