def_get_resolver(self,desired_type:str|list,context:ResolutionContext):# we use a list to support fallbacksifnotisinstance(desired_type,List):desired_type=[desired_type]for_typeindesired_type:# first, resolve aliasesif_typeinself.container._exact_aliases:_type=self.container._exact_aliases[_type]elif_typeinself.container._aliases:# XXX this looks half implemented in rodi, maybe uselessfor_aliasinself.container._aliases[_type]:if_aliasincontext.resolved:_type=_alias# if we already have a resolver, we're done.if_typeincontext.resolved:returncontext.resolved[_type]reg=self.container._map.get(_type)ifregisNone:continueresolver=reg(context)# add the resolver to the context, so we can find it next time we need itcontext.resolved[_type]=resolverreturnresolverraiseCannotResolveTypeException(desired_type)@cached_propertydefbase_type(self):returnimport_string(self.service.base)ifself.service.baseelseself.concrete_type@cached_propertydefconcrete_type(self)->Type:_type=self.service.typeorself.service.baseifisinstance(_type,str):returnimport_string(_type)forcandidatein_type:ifcandidateisnotNoneandisinstance(candidate,str):returnimport_string(candidate)raiseValueError(f"Could not resolve concrete type for service {self.service.name}.")@cached_propertydefpositionals(self):returnself.service.positionalsifself.service.positionalsisnotNoneelse()@cached_propertydefarguments(self):returnself.service.argumentsifself.service.argumentsisnotNoneelse{}@cached_propertydefdefaults(self):returnself.service.defaultsifself.service.defaultsisnotNoneelse{}@cached_propertydefconstructor(self):returnself.service.constructor@cached_propertydefsignature(self):# try to build the signature object, or return None if it is not possible. Cython objects for example does not# have signatures (see https://cython.readthedocs.io/en/latest/src/userguide/limitations.html#inspect-support)ifself.constructor:try:returnsignature(getattr(self.concrete_type,self.constructor))exceptValueError:returnNonetry:returnsignature(self.concrete_type)exceptValueError:returnNonedef__call__(self,context:ResolutionContext):concrete_type=self.concrete_typechain=context.dynamic_chainchain.append(concrete_type)args=[]forarginself.positionals:ifisinstance(arg,LazyServiceReference):args.append(self._get_resolver(arg.target,context))else:args.append(arg)kwargs={}for_name,_valueinself.defaults.items():ifisinstance(_value,LazyServiceReference|LazyService):kwargs[_name]=_value.resolve(self._get_resolver,context)else:kwargs[_name]=_valueifself.signature:for_name,_valueinself.signature.parameters.items():if_value.annotationinself.container._map:kwargs.setdefault(_name,self._get_resolver(_value.annotation,context))for_name,_valueinself.arguments.items():ifisinstance(_value,LazyServiceReference|LazyService):kwargs[_name]=_value.resolve(self._get_resolver,context)else:kwargs[_name]=_valuereturnServiceProvider(concrete_type,self.constructor,args=args,kwargs=kwargs,lifestyle=self.lifestyle,)def__repr__(self):returnf"<{type(self).__name__} for {self.base_type.__name__}>"