You've already forked FrameTour-RenderWorker
117 lines
4.3 KiB
Python
117 lines
4.3 KiB
Python
"""
|
|
服务容器模块 - 提供线程安全的服务实例管理
|
|
"""
|
|
import threading
|
|
from typing import Dict, Type, TypeVar, Optional
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
T = TypeVar('T')
|
|
|
|
class ServiceContainer:
|
|
"""线程安全的服务容器,实现依赖注入和单例管理"""
|
|
|
|
def __init__(self):
|
|
self._services: Dict[Type, object] = {}
|
|
self._factories: Dict[Type, callable] = {}
|
|
self._lock = threading.RLock()
|
|
|
|
def register_singleton(self, service_type: Type[T], factory: callable) -> None:
|
|
"""注册单例服务工厂"""
|
|
with self._lock:
|
|
self._factories[service_type] = factory
|
|
logger.debug(f"Registered singleton factory for {service_type.__name__}")
|
|
|
|
def get_service(self, service_type: Type[T]) -> T:
|
|
"""获取服务实例(懒加载单例)"""
|
|
with self._lock:
|
|
# 检查是否已存在实例
|
|
if service_type in self._services:
|
|
return self._services[service_type]
|
|
|
|
# 检查是否有工厂方法
|
|
if service_type not in self._factories:
|
|
raise ValueError(f"No factory registered for service type: {service_type}")
|
|
|
|
# 创建新实例
|
|
factory = self._factories[service_type]
|
|
try:
|
|
instance = factory()
|
|
self._services[service_type] = instance
|
|
logger.debug(f"Created new instance of {service_type.__name__}")
|
|
return instance
|
|
except Exception as e:
|
|
logger.error(f"Failed to create instance of {service_type.__name__}: {e}")
|
|
raise
|
|
|
|
def has_service(self, service_type: Type[T]) -> bool:
|
|
"""检查是否有服务注册"""
|
|
with self._lock:
|
|
return service_type in self._factories
|
|
|
|
def clear_cache(self, service_type: Optional[Type[T]] = None) -> None:
|
|
"""清理服务缓存"""
|
|
with self._lock:
|
|
if service_type:
|
|
self._services.pop(service_type, None)
|
|
logger.debug(f"Cleared cache for {service_type.__name__}")
|
|
else:
|
|
self._services.clear()
|
|
logger.debug("Cleared all service cache")
|
|
|
|
# 全局服务容器实例
|
|
_container: Optional[ServiceContainer] = None
|
|
_container_lock = threading.Lock()
|
|
|
|
def get_container() -> ServiceContainer:
|
|
"""获取全局服务容器实例"""
|
|
global _container
|
|
if _container is None:
|
|
with _container_lock:
|
|
if _container is None:
|
|
_container = ServiceContainer()
|
|
return _container
|
|
|
|
def register_default_services():
|
|
"""注册默认的服务实现"""
|
|
from .render_service import DefaultRenderService, RenderService
|
|
from .template_service import DefaultTemplateService, TemplateService
|
|
from .task_service import DefaultTaskService, TaskService
|
|
|
|
container = get_container()
|
|
|
|
# 注册渲染服务
|
|
container.register_singleton(RenderService, lambda: DefaultRenderService())
|
|
|
|
# 注册模板服务
|
|
def create_template_service():
|
|
service = DefaultTemplateService()
|
|
service.load_local_templates()
|
|
return service
|
|
container.register_singleton(TemplateService, create_template_service)
|
|
|
|
# 注册任务服务(依赖其他服务)
|
|
def create_task_service():
|
|
render_service = container.get_service(RenderService)
|
|
template_service = container.get_service(TemplateService)
|
|
return DefaultTaskService(render_service, template_service)
|
|
container.register_singleton(TaskService, create_task_service)
|
|
|
|
logger.info("Default services registered successfully")
|
|
|
|
# 便捷函数
|
|
def get_render_service() -> 'RenderService':
|
|
"""获取渲染服务实例"""
|
|
from .render_service import RenderService
|
|
return get_container().get_service(RenderService)
|
|
|
|
def get_template_service() -> 'TemplateService':
|
|
"""获取模板服务实例"""
|
|
from .template_service import TemplateService
|
|
return get_container().get_service(TemplateService)
|
|
|
|
def get_task_service() -> 'TaskService':
|
|
"""获取任务服务实例"""
|
|
from .task_service import TaskService
|
|
return get_container().get_service(TaskService) |