diff options
Diffstat (limited to 'src/di_container/blocking/binding')
-rw-r--r-- | src/di_container/blocking/binding/builder.rs | 55 | ||||
-rw-r--r-- | src/di_container/blocking/binding/mod.rs | 5 |
2 files changed, 21 insertions, 39 deletions
diff --git a/src/di_container/blocking/binding/builder.rs b/src/di_container/blocking/binding/builder.rs index 9f7f6f9..596a2aa 100644 --- a/src/di_container/blocking/binding/builder.rs +++ b/src/di_container/blocking/binding/builder.rs @@ -1,13 +1,16 @@ //! Binding builder for types inside of a [`DIContainer`]. use std::any::type_name; use std::marker::PhantomData; +use std::rc::Rc; +use crate::castable_function::CastableFunction; use crate::di_container::blocking::binding::scope_configurator::BindingScopeConfigurator; -#[cfg(feature = "factory")] use crate::di_container::blocking::binding::when_configurator::BindingWhenConfigurator; use crate::di_container::BindingOptions; use crate::errors::di_container::BindingBuilderError; use crate::interfaces::injectable::Injectable; +use crate::provider::blocking::{FunctionProvider, ProvidableFunctionKind}; +use crate::ptr::TransientPtr; use crate::util::use_double; use_double!(crate::dependency_history::DependencyHistory); @@ -181,8 +184,6 @@ where Interface: Fn<Args, Output = crate::ptr::TransientPtr<Return>>, Func: Fn(&DIContainer) -> Box<Interface>, { - use crate::castable_factory::CastableFactory; - if self .di_container .has_binding::<Interface>(BindingOptions::new()) @@ -192,21 +193,21 @@ where >())); } - let factory_impl = CastableFactory::new(factory_func); + let factory_impl = CastableFunction::new(factory_func); self.di_container.set_binding::<Interface>( BindingOptions::new(), - Box::new(crate::provider::blocking::FactoryProvider::new( - crate::ptr::FactoryPtr::new(factory_impl), - false, + Box::new(FunctionProvider::new( + Rc::new(factory_impl), + ProvidableFunctionKind::UserCalled, )), ); Ok(BindingWhenConfigurator::new(self.di_container)) } - /// Creates a binding of type `Interface` to a factory that takes no arguments - /// inside of the associated [`DIContainer`]. + /// Creates a binding of type `Interface` to a value resolved using the given + /// function. /// /// # Errors /// Will return Err if the associated [`DIContainer`] already have a binding for @@ -244,33 +245,20 @@ where /// # { /// # let mut di_container = DIContainer::new(); /// # - /// di_container.bind::<dyn IBuffer>().to_default_factory(&|_| { - /// Box::new(|| { - /// let buffer = TransientPtr::new(Buffer::<BUFFER_SIZE>::new()); - /// - /// buffer as TransientPtr<dyn IBuffer> - /// }) + /// di_container.bind::<dyn IBuffer>().to_dynamic_value(&|_| { + /// Box::new(|| TransientPtr::new(Buffer::<BUFFER_SIZE>::new())) /// }); /// # /// # Ok(()) /// # } /// ``` - #[cfg(feature = "factory")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "factory")))] - pub fn to_default_factory<Return, FactoryFunc>( + pub fn to_dynamic_value<Func>( self, - factory_func: &'static FactoryFunc, + func: &'static Func, ) -> Result<BindingWhenConfigurator<'di_container, Interface>, BindingBuilderError> where - Return: 'static + ?Sized, - FactoryFunc: Fn( - &DIContainer, - ) -> crate::ptr::TransientPtr< - dyn Fn<(), Output = crate::ptr::TransientPtr<Return>>, - >, + Func: Fn(&DIContainer) -> TransientPtr<dyn Fn() -> TransientPtr<Interface>>, { - use crate::castable_factory::CastableFactory; - if self .di_container .has_binding::<Interface>(BindingOptions::new()) @@ -280,13 +268,13 @@ where >())); } - let factory_impl = CastableFactory::new(factory_func); + let castable_func = CastableFunction::new(func); self.di_container.set_binding::<Interface>( BindingOptions::new(), - Box::new(crate::provider::blocking::FactoryProvider::new( - crate::ptr::FactoryPtr::new(factory_impl), - true, + Box::new(FunctionProvider::new( + Rc::new(castable_func), + ProvidableFunctionKind::Instant, )), ); @@ -370,8 +358,7 @@ mod tests } #[test] - #[cfg(feature = "factory")] - fn can_bind_to_default_factory() + fn can_bind_to_dynamic_value() { use crate::ptr::TransientPtr; @@ -395,7 +382,7 @@ mod tests ); binding_builder - .to_default_factory(&|_| { + .to_dynamic_value(&|_| { Box::new(move || { let user_manager: TransientPtr<dyn subjects::IUserManager> = TransientPtr::new(subjects::UserManager::new()); diff --git a/src/di_container/blocking/binding/mod.rs b/src/di_container/blocking/binding/mod.rs deleted file mode 100644 index 6a09bff..0000000 --- a/src/di_container/blocking/binding/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -//! Types for building & configurating DI container bindings. - -pub mod builder; -pub mod scope_configurator; -pub mod when_configurator; |