From 9e01cdf341a7866180b3a63d745f3b2d7578d28a Mon Sep 17 00:00:00 2001 From: HampusM Date: Sun, 23 Oct 2022 18:12:23 +0200 Subject: refactor!: reduce DI container coupling BREAKING CHANGE: You now have to import the DI containers's interfaces to use the DI containers's methods --- .../blocking/binding/scope_configurator.rs | 45 +++++++++++++--------- 1 file changed, 27 insertions(+), 18 deletions(-) (limited to 'src/di_container/blocking/binding/scope_configurator.rs') diff --git a/src/di_container/blocking/binding/scope_configurator.rs b/src/di_container/blocking/binding/scope_configurator.rs index 09897b6..5553415 100644 --- a/src/di_container/blocking/binding/scope_configurator.rs +++ b/src/di_container/blocking/binding/scope_configurator.rs @@ -1,31 +1,38 @@ -//! Scope configurator for a binding for types inside of a [`DIContainer`]. +//! Scope configurator for a binding for types inside of a [`IDIContainer`]. +//! +//! [`IDIContainer`]: crate::di_container::blocking::IDIContainer use std::marker::PhantomData; use std::rc::Rc; use crate::di_container::blocking::binding::when_configurator::BindingWhenConfigurator; -use crate::di_container::blocking::DIContainer; +use crate::di_container::blocking::IDIContainer; use crate::errors::di_container::BindingScopeConfiguratorError; use crate::interfaces::injectable::Injectable; use crate::provider::blocking::{SingletonProvider, TransientTypeProvider}; use crate::ptr::SingletonPtr; -/// Scope configurator for a binding for type 'Interface' inside a [`DIContainer`]. -pub struct BindingScopeConfigurator +/// Scope configurator for a binding for type 'Interface' inside a [`IDIContainer`]. +/// +/// [`IDIContainer`]: crate::di_container::blocking::IDIContainer +pub struct BindingScopeConfigurator where Interface: 'static + ?Sized, - Implementation: Injectable, + Implementation: Injectable, + DIContainerType: IDIContainer, { - di_container: Rc, + di_container: Rc, interface_phantom: PhantomData, implementation_phantom: PhantomData, } -impl BindingScopeConfigurator +impl + BindingScopeConfigurator where Interface: 'static + ?Sized, - Implementation: Injectable, + Implementation: Injectable, + DIContainerType: IDIContainer, { - pub(crate) fn new(di_container: Rc) -> Self + pub(crate) fn new(di_container: Rc) -> Self { Self { di_container, @@ -38,13 +45,13 @@ where /// /// This is the default. #[allow(clippy::must_use_candidate)] - pub fn in_transient_scope(&self) -> BindingWhenConfigurator + pub fn in_transient_scope( + &self, + ) -> BindingWhenConfigurator { - let mut bindings_mut = self.di_container.bindings.borrow_mut(); - - bindings_mut.set::( + self.di_container.set_binding::( None, - Box::new(TransientTypeProvider::::new()), + Box::new(TransientTypeProvider::::new()), ); BindingWhenConfigurator::new(self.di_container.clone()) @@ -56,16 +63,18 @@ where /// Will return Err if resolving the implementation fails. pub fn in_singleton_scope( &self, - ) -> Result, BindingScopeConfiguratorError> + ) -> Result< + BindingWhenConfigurator, + BindingScopeConfiguratorError, + > { let singleton: SingletonPtr = SingletonPtr::from( Implementation::resolve(&self.di_container, Vec::new()) .map_err(BindingScopeConfiguratorError::SingletonResolveFailed)?, ); - let mut bindings_mut = self.di_container.bindings.borrow_mut(); - - bindings_mut.set::(None, Box::new(SingletonProvider::new(singleton))); + self.di_container + .set_binding::(None, Box::new(SingletonProvider::new(singleton))); Ok(BindingWhenConfigurator::new(self.di_container.clone())) } -- cgit v1.2.3-18-g5258