Added cache
This commit is contained in:
@@ -2,6 +2,7 @@ from typing import Union, Type, Callable, Self
|
||||
|
||||
from cpl.core.log.logger_abc import LoggerABC
|
||||
from cpl.core.typing import T, Service
|
||||
from cpl.core.utils.cache import Cache
|
||||
from cpl.dependency.service_descriptor import ServiceDescriptor
|
||||
from cpl.dependency.service_lifetime_enum import ServiceLifetimeEnum
|
||||
from cpl.dependency.service_provider import ServiceProvider
|
||||
@@ -96,3 +97,7 @@ class ServiceCollection:
|
||||
for wrapper in WrappedLogger.__subclasses__():
|
||||
self.add_transient(wrapper)
|
||||
return self
|
||||
|
||||
def add_cache(self, t: Type[T]):
|
||||
self._service_descriptors.append(ServiceDescriptor(Cache(t=t), ServiceLifetimeEnum.singleton, Cache[t]))
|
||||
return self
|
||||
|
||||
@@ -37,8 +37,23 @@ class ServiceProvider(ServiceProviderABC):
|
||||
self._scope: Optional[ScopeABC] = None
|
||||
|
||||
def _find_service(self, service_type: type) -> Optional[ServiceDescriptor]:
|
||||
origin_type = typing.get_origin(service_type) or service_type
|
||||
type_args = list(typing.get_args(service_type))
|
||||
|
||||
for descriptor in self._service_descriptors:
|
||||
if descriptor.service_type == service_type or issubclass(descriptor.base_type, service_type):
|
||||
descriptor_base_type = typing.get_origin(descriptor.base_type) or descriptor.base_type
|
||||
descriptor_type_args = list(typing.get_args(descriptor.base_type))
|
||||
|
||||
if descriptor_base_type == origin_type and len(descriptor_type_args) == 0 and len(type_args) == 0:
|
||||
return descriptor
|
||||
|
||||
if descriptor_base_type != origin_type or len(descriptor_type_args) != len(type_args):
|
||||
continue
|
||||
|
||||
if descriptor_base_type == origin_type and type_args != descriptor_type_args:
|
||||
continue
|
||||
|
||||
if descriptor.service_type == origin_type or issubclass(descriptor.base_type, origin_type):
|
||||
return descriptor
|
||||
|
||||
return None
|
||||
@@ -158,7 +173,6 @@ class ServiceProvider(ServiceProviderABC):
|
||||
|
||||
return implementation
|
||||
|
||||
|
||||
def get_service_type(self, service_type: Type[T]) -> Optional[Type[T]]:
|
||||
for descriptor in self._service_descriptors:
|
||||
if descriptor.service_type == service_type or issubclass(descriptor.service_type, service_type):
|
||||
|
||||
@@ -86,7 +86,7 @@ class ServiceProviderABC(ABC):
|
||||
"""
|
||||
|
||||
@abstractmethod
|
||||
def get_service_type(self,instance_type: Type[T]) -> Optional[Type[T]]:
|
||||
def get_service_type(self, instance_type: Type[T]) -> Optional[Type[T]]:
|
||||
r"""Returns the registered service type for loggers
|
||||
|
||||
Parameter
|
||||
|
||||
Reference in New Issue
Block a user