41 lines
1.8 KiB
Markdown
41 lines
1.8 KiB
Markdown
## Dependency Injection
|
|
|
|
* Prefer Angular dependency injection for application services.
|
|
* Keep injected dependencies minimal.
|
|
* Avoid service locator patterns.
|
|
* Prefer `inject()` where it improves readability and is consistent with the project.
|
|
* Do not inject services that are not used.
|
|
* Scope services intentionally.
|
|
* Prefer application-wide singletons only for truly shared stateless or coordinated state.
|
|
* Avoid storing request-specific or component-specific mutable state in root services.
|
|
* Use injection tokens for configuration or abstractions where appropriate.
|
|
* Do not create interfaces only to satisfy dependency injection when no abstraction is needed.
|
|
|
|
## Services
|
|
|
|
* Keep services focused on a clear responsibility.
|
|
* Avoid large catch-all services.
|
|
* Separate API access, domain logic and UI state where practical.
|
|
* Avoid leaking transport models throughout the application.
|
|
* Do not expose mutable internal state directly.
|
|
* Prefer readonly APIs for state consumers.
|
|
* Avoid hidden side effects.
|
|
* Keep service methods predictable.
|
|
* Do not use services merely to move poorly structured component code elsewhere.
|
|
|
|
## HTTP and APIs
|
|
|
|
* Keep API access centralized and strongly typed.
|
|
* Prefer dedicated API clients or data-access services.
|
|
* Do not use `any` for API responses.
|
|
* Treat all server responses as untrusted at runtime.
|
|
* Validate external data when the contract is security- or correctness-critical.
|
|
* Keep DTOs separate from domain models when their responsibilities differ.
|
|
* Avoid duplicate API calls.
|
|
* Cache only when the invalidation strategy is clear.
|
|
* Avoid manual URL string construction when typed helpers or centralized endpoints are available.
|
|
* Use interceptors only for cross-cutting concerns.
|
|
* Do not put unrelated business logic into HTTP interceptors.
|
|
* Handle cancellation where appropriate.
|
|
* Handle expected error states explicitly.
|