pub struct Scope { /* private fields */ }Expand description
A scoped service provider — created via ServiceProvider::scope.
内部持有一个 scope 范围的 ServiceProvider(由 ServiceProvider::new_scope 派生),
共享 root 的 store/singleton_cache/named,独立 scoped 缓存。
所有解析方法委托给内嵌的 scope_provider,确保:
- Scoped 服务在 scope 内缓存复用。
- Transient 依赖通过
scope_provider解析,正确绑定到当前 scope(MEDI 语义)。 #[inject(provider)]字段拿到的是 scope 范围的 provider,经该字段解析 Scoped 服务命中 scope 缓存——不泄漏到 root。
§资源释放
Scope::dispose(以及 Drop 安全网)会按 创建逆序 释放该 scope 创建的
Scoped 实例(实例的 Drop 在最后一个引用释放时运行),并按注册逆序执行
ServiceProvider::register_disposable 注册的清理闭包。释放后 scope 解析返回
RdiError::ScopeDisposed。
Implementations§
Source§impl Scope
impl Scope
Sourcepub fn scope_provider(&self) -> &Arc<ServiceProvider> ⓘ
pub fn scope_provider(&self) -> &Arc<ServiceProvider> ⓘ
Returns the scope-local ServiceProvider backing this scope.
Exposed for advanced use cases (e.g. passing the scope provider to
ServiceProviderWrapper). Most callers should use Self::get /
Self::get_owned directly.
Sourcepub fn dispose(&self)
pub fn dispose(&self)
Dispose the scope: release scoped instances in reverse creation order,
then run register_disposable cleanups in reverse registration order.
Idempotent; also called by Drop. After disposal, resolution through
this scope returns RdiError::ScopeDisposed (or None/empty for
infallible lookups).
pub fn get<T: ?Sized + Send + Sync + 'static>(&self) -> Result<Arc<T>, RdiError>
pub fn get_optional<T: ?Sized + Send + Sync + 'static>(&self) -> Option<Arc<T>>
pub fn get_keyed<T: ?Sized + Send + Sync + 'static>( &self, key: impl Into<ServiceKey>, ) -> Result<Arc<T>, RdiError>
Sourcepub fn get_async<T: ?Sized + Send + Sync + 'static>(
&self,
) -> impl Future<Output = Result<Arc<T>, RdiError>> + Send + '_
pub fn get_async<T: ?Sized + Send + Sync + 'static>( &self, ) -> impl Future<Output = Result<Arc<T>, RdiError>> + Send + '_
Resolve an async service (transient or scoped) within this scope.
Sourcepub fn get_keyed_async<T: ?Sized + Send + Sync + 'static>(
&self,
key: impl Into<ServiceKey> + Send,
) -> impl Future<Output = Result<Arc<T>, RdiError>> + Send + '_
pub fn get_keyed_async<T: ?Sized + Send + Sync + 'static>( &self, key: impl Into<ServiceKey> + Send, ) -> impl Future<Output = Result<Arc<T>, RdiError>> + Send + '_
Resolve an async keyed service within this scope.
Sourcepub fn get_owned<T: Send + Sync + 'static>(&self) -> Result<T, RdiError>
pub fn get_owned<T: Send + Sync + 'static>(&self) -> Result<T, RdiError>
Resolve owned T within this scope (bypass cache, fresh each call).
Returns Err if not registered or the service is Singleton.
Sourcepub fn try_get_owned<T: Send + Sync + 'static>(&self) -> Option<T>
pub fn try_get_owned<T: Send + Sync + 'static>(&self) -> Option<T>
Resolve owned T, returning None if not registered or Singleton.
Sourcepub fn get_keyed_owned<T: Send + Sync + 'static>(
&self,
key: impl Into<ServiceKey>,
) -> Result<T, RdiError>
pub fn get_keyed_owned<T: Send + Sync + 'static>( &self, key: impl Into<ServiceKey>, ) -> Result<T, RdiError>
Resolve owned keyed T.
Returns Err if not found or Singleton.
Sourcepub fn try_get_keyed_owned<T: Send + Sync + 'static>(
&self,
key: impl Into<ServiceKey>,
) -> Option<T>
pub fn try_get_keyed_owned<T: Send + Sync + 'static>( &self, key: impl Into<ServiceKey>, ) -> Option<T>
Resolve owned keyed T, returning None if not found or Singleton.
Sourcepub fn get_all<T: ?Sized + Send + Sync + 'static>(&self) -> Vec<Arc<T>>
pub fn get_all<T: ?Sized + Send + Sync + 'static>(&self) -> Vec<Arc<T>>
Return all unkeyed registered instances (MEDI GetServices<T>()).
Sourcepub fn get_all_keyed<T: ?Sized + Send + Sync + 'static>(&self) -> Vec<Arc<T>>
pub fn get_all_keyed<T: ?Sized + Send + Sync + 'static>(&self) -> Vec<Arc<T>>
Return all keyed registered instances (MEDI GetKeyedServices<T>()).
Sourcepub fn is_registered<T: ?Sized + Send + Sync + 'static>(&self) -> bool
pub fn is_registered<T: ?Sized + Send + Sync + 'static>(&self) -> bool
Whether T has a resolvable registration (MEDI IServiceProviderIsService).
Sourcepub fn is_registered_keyed<T: ?Sized + Send + Sync + 'static>(
&self,
key: impl Into<ServiceKey>,
) -> bool
pub fn is_registered_keyed<T: ?Sized + Send + Sync + 'static>( &self, key: impl Into<ServiceKey>, ) -> bool
Whether T has a registration under key.
Whether T has a registration under key (exact or AnyKey fallback).
Sourcepub fn async_context(&self) -> Option<AsyncFactoryContext>
pub fn async_context(&self) -> Option<AsyncFactoryContext>
Create an AsyncFactoryContext bound to
the current async resolution chain (for detached task propagation).
pub fn get_named_any(&self, name: &str) -> Option<Arc<dyn Any + Send + Sync>>
Sourcepub fn rdi_register_named(
&self,
name: &str,
service: Arc<dyn Any + Send + Sync>,
)
pub fn rdi_register_named( &self, name: &str, service: Arc<dyn Any + Send + Sync>, )
Register a named service (for IProvider trait).
Sourcepub fn rdi_remove_named(&self, name: &str)
pub fn rdi_remove_named(&self, name: &str)
Remove a named service (for IProvider trait).
Trait Implementations§
Source§impl IServiceResolver for Scope
impl IServiceResolver for Scope
fn get_any(&self, key: &str) -> Option<Arc<dyn Any + Send + Sync>>
fn get_keyed_any( &self, key: &str, variant: &str, ) -> Option<Arc<dyn Any + Send + Sync>>
Source§fn get_keyed_any_key(
&self,
key: &str,
variant: &ServiceKey,
) -> Option<Arc<dyn Any + Send + Sync>>
fn get_keyed_any_key( &self, key: &str, variant: &ServiceKey, ) -> Option<Arc<dyn Any + Send + Sync>>
#[inject(key = <expr>)]). Read moreSource§fn try_get_keyed_any_result_key(
&self,
key: &str,
variant: &ServiceKey,
) -> Result<Option<Arc<dyn Any + Send + Sync>>, RdiError>
fn try_get_keyed_any_result_key( &self, key: &str, variant: &ServiceKey, ) -> Result<Option<Arc<dyn Any + Send + Sync>>, RdiError>
Self::get_keyed_any_key.Source§fn get_keyed_owned_any_key(
&self,
key: &str,
variant: &ServiceKey,
) -> Option<Arc<dyn Any + Send + Sync>>
fn get_keyed_owned_any_key( &self, key: &str, variant: &ServiceKey, ) -> Option<Arc<dyn Any + Send + Sync>>
Source§fn try_get_keyed_owned_any_key(
&self,
key: &str,
variant: &ServiceKey,
) -> Result<Option<Arc<dyn Any + Send + Sync>>, RdiError>
fn try_get_keyed_owned_any_key( &self, key: &str, variant: &ServiceKey, ) -> Result<Option<Arc<dyn Any + Send + Sync>>, RdiError>
Self::get_keyed_owned_any_key.Source§fn get_keyed_by_type_id(
&self,
tid: TypeId,
key: &str,
) -> Option<Arc<dyn Any + Send + Sync>>
fn get_keyed_by_type_id( &self, tid: TypeId, key: &str, ) -> Option<Arc<dyn Any + Send + Sync>>
None)。 Read moreSource§fn get_all_any(&self, key: &str) -> Vec<Arc<dyn Any + Send + Sync>>
fn get_all_any(&self, key: &str) -> Vec<Arc<dyn Any + Send + Sync>>
Source§fn get_all_keyed_any(&self, key: &str) -> Vec<Arc<dyn Any + Send + Sync>>
fn get_all_keyed_any(&self, key: &str) -> Vec<Arc<dyn Any + Send + Sync>>
GetKeyedServices<T>(KeyedService.AnyKey)). Read moreSource§fn get_all_any_result(
&self,
key: &str,
) -> Result<Vec<Arc<dyn Any + Send + Sync>>, RdiError>
fn get_all_any_result( &self, key: &str, ) -> Result<Vec<Arc<dyn Any + Send + Sync>>, RdiError>
Self::get_all_any, used by the inject
macros for Vec<Arc<T>> fields. Read moreSource§fn get_owned_any(&self, key: &str) -> Option<Arc<dyn Any + Send + Sync>>
fn get_owned_any(&self, key: &str) -> Option<Arc<dyn Any + Send + Sync>>
Arc<dyn Any + Send + Sync> (concrete Arc<Arc<T>>). Read moreSource§fn try_get_any_result(
&self,
key: &str,
) -> Result<Option<Arc<dyn Any + Send + Sync>>, RdiError>
fn try_get_any_result( &self, key: &str, ) -> Result<Option<Arc<dyn Any + Send + Sync>>, RdiError>
Self::try_get. Read moreSource§fn try_get_keyed_any_result(
&self,
key: &str,
variant: &str,
) -> Result<Option<Arc<dyn Any + Send + Sync>>, RdiError>
fn try_get_keyed_any_result( &self, key: &str, variant: &str, ) -> Result<Option<Arc<dyn Any + Send + Sync>>, RdiError>
Self::try_get_keyed. Read morefn get_keyed_owned_any( &self, key: &str, variant: &str, ) -> Option<Arc<dyn Any + Send + Sync>>
Source§fn provider_arc(&self) -> Option<Arc<ServiceProvider>>
fn provider_arc(&self) -> Option<Arc<ServiceProvider>>
Arc<ServiceProvider> for on-demand service resolution. Read moreSource§fn get<T: ?Sized + Sync + Send + 'static>(&self) -> Result<Arc<T>, RdiError>where
Self: Sized,
fn get<T: ?Sized + Sync + Send + 'static>(&self) -> Result<Arc<T>, RdiError>where
Self: Sized,
dyn Trait).
Returns Err(RdiError::ServiceNotFound) if not registered. Read moreSource§fn try_get<T: ?Sized + Sync + Send + 'static>(&self) -> Option<Arc<T>>where
Self: Sized,
fn try_get<T: ?Sized + Sync + Send + 'static>(&self) -> Option<Arc<T>>where
Self: Sized,
None if it is not registered or
not resolvable at this point (e.g. a scoped service under root scope
validation, or a disposed provider/scope). Read moreSource§fn get_keyed<T: ?Sized + Sync + Send + 'static>(
&self,
variant: &str,
) -> Result<Arc<T>, RdiError>where
Self: Sized,
fn get_keyed<T: ?Sized + Sync + Send + 'static>(
&self,
variant: &str,
) -> Result<Arc<T>, RdiError>where
Self: Sized,
Err if not found.Source§fn try_get_keyed<T: ?Sized + Sync + Send + 'static>(
&self,
variant: &str,
) -> Option<Arc<T>>where
Self: Sized,
fn try_get_keyed<T: ?Sized + Sync + Send + 'static>(
&self,
variant: &str,
) -> Option<Arc<T>>where
Self: Sized,
None if not found or
not resolvable at this point (e.g. root scope validation, disposed
provider/scope). Never panics for framework-level failures.Source§fn get_all<T: ?Sized + Sync + Send + 'static>(&self) -> Vec<Arc<T>>where
Self: Sized,
fn get_all<T: ?Sized + Sync + Send + 'static>(&self) -> Vec<Arc<T>>where
Self: Sized,
T, in registration
order. Read moreSource§fn get_owned<T: Send + Sync + 'static>(&self) -> Result<T, RdiError>where
Self: Sized,
fn get_owned<T: Send + Sync + 'static>(&self) -> Result<T, RdiError>where
Self: Sized,
T (bypass cache, fresh each call).
Returns Err if not registered or the service is Singleton.Source§fn try_get_owned<T: Send + Sync + 'static>(&self) -> Option<T>where
Self: Sized,
fn try_get_owned<T: Send + Sync + 'static>(&self) -> Option<T>where
Self: Sized,
T, returning None if not registered or Singleton.