refactor: Make service dependencies explicit and injectable
Remove hidden cross-service coupling by making dependencies explicit through dependency injection while maintaining backward compatibility via lazy imports. Key changes: - history_service and ban_service: Removed direct module-level imports of fail2ban_metadata_service, added optional service parameters to functions - Added get_fail2ban_metadata_service() provider to dependencies.py - Updated history router to inject Fail2BanMetadataService dependency - history_service functions now use lazy imports in fallback paths for backward compatibility when service is not explicitly injected - All test patches updated to use internal _get_fail2ban_db_path() helper - jail_config_service and jail_service already follow best practices This pattern prevents circular imports, makes services testable via explicit mocking, and documents service dependencies clearly. Fixes: Instructions.md #2 - Hidden cross-service coupling Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -372,6 +372,25 @@ class HealthService(Protocol):
|
||||
...
|
||||
|
||||
|
||||
@runtime_checkable
|
||||
class Fail2BanMetadataService(Protocol):
|
||||
"""Protocol for fail2ban runtime metadata resolution and caching."""
|
||||
|
||||
async def get_db_path(self, socket_path: str, *, force_refresh: bool = False) -> str:
|
||||
...
|
||||
|
||||
def invalidate_db_path(self, socket_path: str) -> None:
|
||||
...
|
||||
|
||||
|
||||
@runtime_checkable
|
||||
class HealthProbe(Protocol):
|
||||
"""Protocol for health probing functions that check fail2ban availability."""
|
||||
|
||||
async def __call__(self, socket_path: str) -> ServerStatus:
|
||||
...
|
||||
|
||||
|
||||
@runtime_checkable
|
||||
class ServerService(Protocol):
|
||||
async def get_settings(self, socket_path: str) -> ServerSettingsResponse:
|
||||
|
||||
Reference in New Issue
Block a user