nodebookls/di_container.py
2025-10-29 13:56:24 +08:00

86 lines
3.0 KiB
Python

from typing import Dict, Type, Any, Optional, Callable
from config import settings
from file_processor import TextFileProcessor
from vector_store import VectorStore
from hybrid_retriever import HybridRetriever
from generator import TextGenerator
from exporter import Exporter
from logger import GenerationLogger
from content_analyzer import analyzer
class DIContainer:
"""依赖注入容器"""
def __init__(self):
self._services: Dict[str, Any] = {}
self._singletons: Dict[str, Any] = {}
def register(self, name: str, service_class: Type, is_singleton: bool = False):
"""注册服务"""
self._services[name] = {
'class': service_class,
'singleton': is_singleton
}
def register_factory(self, name: str, factory: Callable, is_singleton: bool = False):
"""注册工厂函数"""
self._services[name] = {
'factory': factory,
'singleton': is_singleton
}
def register_instance(self, name: str, instance: Any, is_singleton: bool = True):
"""注册已创建的实例"""
if is_singleton:
self._singletons[name] = instance
self._services[name] = {
'instance': instance,
'singleton': is_singleton
}
def get(self, name: str, **kwargs) -> Any:
"""获取服务实例"""
if name not in self._services:
raise ValueError(f"Service {name} not registered")
service_info = self._services[name]
# 如果是单例,先检查是否已创建
if service_info['singleton']:
if name in self._singletons:
return self._singletons[name]
# 创建实例
if 'class' in service_info:
# 检查是否需要传递参数
if kwargs:
instance = service_info['class'](**kwargs)
else:
instance = service_info['class']()
elif 'factory' in service_info:
instance = service_info['factory']()
elif 'instance' in service_info:
instance = service_info['instance']
else:
raise ValueError(f"Service {name} has no valid creation method")
if service_info['singleton']:
self._singletons[name] = instance
return instance
# 创建全局容器实例
container = DIContainer()
# 注册所有服务
container.register('file_processor', TextFileProcessor, is_singleton=True)
container.register('vector_store', VectorStore, is_singleton=True)
container.register('text_generator', TextGenerator, is_singleton=True)
container.register('exporter', Exporter, is_singleton=True)
container.register('logger', GenerationLogger, is_singleton=True)
container.register_factory('analyzer', lambda: analyzer, is_singleton=True)
# 注册需要参数的服务
container.register_factory('hybrid_retriever',
lambda: HybridRetriever(container.get('vector_store')),
is_singleton=True)