diff options
Diffstat (limited to 'src/di_container/blocking/binding')
-rw-r--r-- | src/di_container/blocking/binding/builder.rs | 49 | ||||
-rw-r--r-- | src/di_container/blocking/binding/scope_configurator.rs | 25 | ||||
-rw-r--r-- | src/di_container/blocking/binding/when_configurator.rs | 13 |
3 files changed, 43 insertions, 44 deletions
diff --git a/src/di_container/blocking/binding/builder.rs b/src/di_container/blocking/binding/builder.rs index 64e787e..8eebcc0 100644 --- a/src/di_container/blocking/binding/builder.rs +++ b/src/di_container/blocking/binding/builder.rs @@ -1,7 +1,6 @@ //! Binding builder for types inside of a [`DIContainer`]. use std::any::type_name; use std::marker::PhantomData; -use std::rc::Rc; use crate::di_container::blocking::binding::scope_configurator::BindingScopeConfigurator; #[cfg(feature = "factory")] @@ -16,22 +15,22 @@ use_double!(crate::di_container::blocking::DIContainer); /// Binding builder for type `Interface` inside a [`DIContainer`]. #[must_use = "No binding will be created if you don't use the binding builder"] -pub struct BindingBuilder<Interface> +pub struct BindingBuilder<'di_container, Interface> where Interface: 'static + ?Sized, { - di_container: Rc<DIContainer>, + di_container: &'di_container DIContainer, dependency_history_factory: fn() -> DependencyHistory, interface_phantom: PhantomData<Interface>, } -impl<Interface> BindingBuilder<Interface> +impl<'di_container, Interface> BindingBuilder<'di_container, Interface> where Interface: 'static + ?Sized, { pub(crate) fn new( - di_container: Rc<DIContainer>, + di_container: &'di_container DIContainer, dependency_history_factory: fn() -> DependencyHistory, ) -> Self { @@ -83,7 +82,10 @@ where /// ``` pub fn to<Implementation>( self, - ) -> Result<BindingScopeConfigurator<Interface, Implementation>, BindingBuilderError> + ) -> Result< + BindingScopeConfigurator<'di_container, Interface, Implementation>, + BindingBuilderError, + > where Implementation: Injectable<DIContainer>, { @@ -97,7 +99,7 @@ where } let binding_scope_configurator = BindingScopeConfigurator::new( - self.di_container.clone(), + self.di_container, self.dependency_history_factory, ); @@ -151,13 +153,13 @@ where /// di_container /// .bind::<ICustomerFactory>() /// .to_factory(&|context| { - /// Box::new(move |name, id| { - /// let customer_id_factory = context - /// .get::<ICustomerIDFactory>() - /// .unwrap() - /// .factory() - /// .unwrap(); + /// let customer_id_factory = context + /// .get::<ICustomerIDFactory>() + /// .unwrap() + /// .factory() + /// .unwrap(); /// + /// Box::new(move |name, id| { /// let customer_id = customer_id_factory(id); /// /// let customer = TransientPtr::new(Customer::new(name, customer_id)); @@ -174,12 +176,12 @@ where pub fn to_factory<Args, Return, Func>( self, factory_func: &'static Func, - ) -> Result<BindingWhenConfigurator<Interface>, BindingBuilderError> + ) -> Result<BindingWhenConfigurator<'di_container, Interface>, BindingBuilderError> where Args: std::marker::Tuple + 'static, Return: 'static + ?Sized, Interface: Fn<Args, Output = crate::ptr::TransientPtr<Return>>, - Func: Fn<(std::rc::Rc<DIContainer>,), Output = Box<Interface>>, + Func: Fn(&DIContainer) -> Box<Interface>, { use crate::private::castable_factory::blocking::CastableFactory; @@ -260,14 +262,13 @@ where pub fn to_default_factory<Return, FactoryFunc>( self, factory_func: &'static FactoryFunc, - ) -> Result<BindingWhenConfigurator<Interface>, BindingBuilderError> + ) -> Result<BindingWhenConfigurator<'di_container, Interface>, BindingBuilderError> where Return: 'static + ?Sized, - FactoryFunc: Fn< - (Rc<DIContainer>,), - Output = crate::ptr::TransientPtr< - dyn Fn<(), Output = crate::ptr::TransientPtr<Return>>, - >, + FactoryFunc: Fn( + &DIContainer, + ) -> crate::ptr::TransientPtr< + dyn Fn<(), Output = crate::ptr::TransientPtr<Return>>, >, { use crate::private::castable_factory::blocking::CastableFactory; @@ -325,7 +326,7 @@ mod tests .once(); let binding_builder = BindingBuilder::<dyn subjects::INumber>::new( - Rc::new(mock_di_container), + &mock_di_container, MockDependencyHistory::new, ); @@ -361,7 +362,7 @@ mod tests .once(); let binding_builder = BindingBuilder::<IUserManagerFactory>::new( - Rc::new(mock_di_container), + &mock_di_container, MockDependencyHistory::new, ); @@ -403,7 +404,7 @@ mod tests .once(); let binding_builder = BindingBuilder::<dyn subjects::IUserManager>::new( - Rc::new(mock_di_container), + &mock_di_container, MockDependencyHistory::new, ); diff --git a/src/di_container/blocking/binding/scope_configurator.rs b/src/di_container/blocking/binding/scope_configurator.rs index be469ba..3d939ba 100644 --- a/src/di_container/blocking/binding/scope_configurator.rs +++ b/src/di_container/blocking/binding/scope_configurator.rs @@ -1,6 +1,5 @@ //! Scope configurator for a binding for types inside of a [`DIContainer`]. use std::marker::PhantomData; -use std::rc::Rc; use crate::di_container::blocking::binding::when_configurator::BindingWhenConfigurator; use crate::di_container::BindingOptions; @@ -14,25 +13,26 @@ use_double!(crate::dependency_history::DependencyHistory); use_double!(crate::di_container::blocking::DIContainer); /// Scope configurator for a binding for type `Interface` inside a [`DIContainer`]. -pub struct BindingScopeConfigurator<Interface, Implementation> +pub struct BindingScopeConfigurator<'di_container, Interface, Implementation> where Interface: 'static + ?Sized, Implementation: Injectable<DIContainer>, { - di_container: Rc<DIContainer>, + di_container: &'di_container DIContainer, dependency_history_factory: fn() -> DependencyHistory, interface_phantom: PhantomData<Interface>, implementation_phantom: PhantomData<Implementation>, } -impl<Interface, Implementation> BindingScopeConfigurator<Interface, Implementation> +impl<'di_container, Interface, Implementation> + BindingScopeConfigurator<'di_container, Interface, Implementation> where Interface: 'static + ?Sized, Implementation: Injectable<DIContainer>, { pub(crate) fn new( - di_container: Rc<DIContainer>, + di_container: &'di_container DIContainer, dependency_history_factory: fn() -> DependencyHistory, ) -> Self { @@ -48,7 +48,7 @@ where /// /// This is the default. #[allow(clippy::must_use_candidate)] - pub fn in_transient_scope(self) -> BindingWhenConfigurator<Interface> + pub fn in_transient_scope(self) -> BindingWhenConfigurator<'di_container, Interface> { self.set_in_transient_scope(); @@ -61,11 +61,14 @@ where /// Will return Err if resolving the implementation fails. pub fn in_singleton_scope( self, - ) -> Result<BindingWhenConfigurator<Interface>, BindingScopeConfiguratorError> + ) -> Result< + BindingWhenConfigurator<'di_container, Interface>, + BindingScopeConfiguratorError, + > { let singleton: SingletonPtr<Implementation> = SingletonPtr::from( Implementation::resolve( - &self.di_container, + self.di_container, (self.dependency_history_factory)(), ) .map_err(BindingScopeConfiguratorError::SingletonResolveFailed)?, @@ -111,8 +114,7 @@ mod tests dyn subjects::IUserManager, subjects::UserManager, >::new( - Rc::new(di_container_mock), - MockDependencyHistory::new, + &di_container_mock, MockDependencyHistory::new ); binding_scope_configurator.in_transient_scope(); @@ -133,8 +135,7 @@ mod tests dyn subjects::IUserManager, subjects::UserManager, >::new( - Rc::new(di_container_mock), - MockDependencyHistory::new, + &di_container_mock, MockDependencyHistory::new ); assert!(binding_scope_configurator.in_singleton_scope().is_ok()); diff --git a/src/di_container/blocking/binding/when_configurator.rs b/src/di_container/blocking/binding/when_configurator.rs index 3d267b2..2a1af2c 100644 --- a/src/di_container/blocking/binding/when_configurator.rs +++ b/src/di_container/blocking/binding/when_configurator.rs @@ -1,7 +1,6 @@ //! When configurator for a binding for types inside of a [`DIContainer`]. use std::any::type_name; use std::marker::PhantomData; -use std::rc::Rc; use crate::di_container::BindingOptions; use crate::errors::di_container::BindingWhenConfiguratorError; @@ -10,20 +9,20 @@ use crate::util::use_double; use_double!(crate::di_container::blocking::DIContainer); /// When configurator for a binding for type `Interface` inside a [`DIContainer`]. -pub struct BindingWhenConfigurator<Interface> +pub struct BindingWhenConfigurator<'di_container, Interface> where Interface: 'static + ?Sized, { - di_container: Rc<DIContainer>, + di_container: &'di_container DIContainer, interface_phantom: PhantomData<Interface>, } -impl<Interface> BindingWhenConfigurator<Interface> +impl<'di_container, Interface> BindingWhenConfigurator<'di_container, Interface> where Interface: 'static + ?Sized, { - pub(crate) fn new(di_container: Rc<DIContainer>) -> Self + pub(crate) fn new(di_container: &'di_container DIContainer) -> Self { Self { di_container, @@ -88,9 +87,7 @@ mod tests .once(); let binding_when_configurator = - BindingWhenConfigurator::<dyn subjects::INumber>::new(Rc::new( - di_container_mock, - )); + BindingWhenConfigurator::<dyn subjects::INumber>::new(&di_container_mock); assert!(binding_when_configurator.when_named("cool").is_ok()); } |