diff options
Diffstat (limited to 'src/di_container/asynchronous/binding')
3 files changed, 79 insertions, 123 deletions
| diff --git a/src/di_container/asynchronous/binding/builder.rs b/src/di_container/asynchronous/binding/builder.rs index d33b840..45597e8 100644 --- a/src/di_container/asynchronous/binding/builder.rs +++ b/src/di_container/asynchronous/binding/builder.rs @@ -5,13 +5,15 @@ use std::any::type_name;  use std::marker::PhantomData;  use std::sync::Arc; -use crate::dependency_history::IDependencyHistory;  use crate::di_container::asynchronous::binding::scope_configurator::AsyncBindingScopeConfigurator;  #[cfg(feature = "factory")]  use crate::di_container::asynchronous::binding::when_configurator::AsyncBindingWhenConfigurator;  use crate::di_container::asynchronous::IAsyncDIContainer;  use crate::errors::async_di_container::AsyncBindingBuilderError;  use crate::interfaces::async_injectable::AsyncInjectable; +use crate::util::use_dependency_history; + +use_dependency_history!();  /// Alias for a threadsafe boxed function.  #[cfg(feature = "factory")] @@ -22,28 +24,25 @@ pub type BoxFn<Args, Return> = Box<(dyn Fn<Args, Output = Return> + Send + Sync)  ///  /// [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer  #[must_use = "No binding will be created if you don't use the binding builder"] -pub struct AsyncBindingBuilder<Interface, DIContainerType, DependencyHistoryType> +pub struct AsyncBindingBuilder<Interface, DIContainerType>  where      Interface: 'static + ?Sized + Send + Sync, -    DIContainerType: IAsyncDIContainer<DependencyHistoryType>, -    DependencyHistoryType: IDependencyHistory + Send + Sync, +    DIContainerType: IAsyncDIContainer,  {      di_container: Arc<DIContainerType>, -    dependency_history_factory: fn() -> DependencyHistoryType, +    dependency_history_factory: fn() -> DependencyHistory,      interface_phantom: PhantomData<Interface>,  } -impl<Interface, DIContainerType, DependencyHistoryType> -    AsyncBindingBuilder<Interface, DIContainerType, DependencyHistoryType> +impl<Interface, DIContainerType> AsyncBindingBuilder<Interface, DIContainerType>  where      Interface: 'static + ?Sized + Send + Sync, -    DIContainerType: IAsyncDIContainer<DependencyHistoryType>, -    DependencyHistoryType: IDependencyHistory + Send + Sync + 'static, +    DIContainerType: IAsyncDIContainer,  {      pub(crate) fn new(          di_container: Arc<DIContainerType>, -        dependency_history_factory: fn() -> DependencyHistoryType, +        dependency_history_factory: fn() -> DependencyHistory,      ) -> Self      {          Self { @@ -99,16 +98,11 @@ where      pub async fn to<Implementation>(          self,      ) -> Result< -        AsyncBindingScopeConfigurator< -            Interface, -            Implementation, -            DIContainerType, -            DependencyHistoryType, -        >, +        AsyncBindingScopeConfigurator<Interface, Implementation, DIContainerType>,          AsyncBindingBuilderError,      >      where -        Implementation: AsyncInjectable<DIContainerType, DependencyHistoryType>, +        Implementation: AsyncInjectable<DIContainerType>,      {          if self.di_container.has_binding::<Interface>(None).await {              return Err(AsyncBindingBuilderError::BindingAlreadyExists(type_name::< @@ -182,7 +176,7 @@ where          self,          factory_func: &'static FactoryFunc,      ) -> Result< -        AsyncBindingWhenConfigurator<Interface, DIContainerType, DependencyHistoryType>, +        AsyncBindingWhenConfigurator<Interface, DIContainerType>,          AsyncBindingBuilderError,      >      where @@ -277,7 +271,7 @@ where          self,          factory_func: &'static FactoryFunc,      ) -> Result< -        AsyncBindingWhenConfigurator<Interface, DIContainerType, DependencyHistoryType>, +        AsyncBindingWhenConfigurator<Interface, DIContainerType>,          AsyncBindingBuilderError,      >      where @@ -370,7 +364,7 @@ where          self,          factory_func: &'static FactoryFunc,      ) -> Result< -        AsyncBindingWhenConfigurator<Interface, DIContainerType, DependencyHistoryType>, +        AsyncBindingWhenConfigurator<Interface, DIContainerType>,          AsyncBindingBuilderError,      >      where @@ -465,7 +459,7 @@ where          self,          factory_func: &'static FactoryFunc,      ) -> Result< -        AsyncBindingWhenConfigurator<Interface, DIContainerType, DependencyHistoryType>, +        AsyncBindingWhenConfigurator<Interface, DIContainerType>,          AsyncBindingBuilderError,      >      where @@ -510,14 +504,14 @@ mod tests      use mockall::predicate::eq;      use super::*; +    use crate::dependency_history::MockDependencyHistory;      use crate::test_utils::{mocks, subjects_async};      #[tokio::test]      async fn can_bind_to() -> Result<(), Box<dyn Error>>      { -        let mut di_container_mock = mocks::async_di_container::MockAsyncDIContainer::< -            mocks::MockDependencyHistory, -        >::new(); +        let mut di_container_mock = +            mocks::async_di_container::MockAsyncDIContainer::new();          di_container_mock              .expect_has_binding::<dyn subjects_async::IUserManager>() @@ -531,14 +525,11 @@ mod tests              .return_once(|_name, _provider| ())              .once(); -        let binding_builder = AsyncBindingBuilder::< -            dyn subjects_async::IUserManager, -            mocks::async_di_container::MockAsyncDIContainer<mocks::MockDependencyHistory>, -            mocks::MockDependencyHistory, -        >::new( -            Arc::new(di_container_mock), -            mocks::MockDependencyHistory::new, -        ); +        let binding_builder = +            AsyncBindingBuilder::< +                dyn subjects_async::IUserManager, +                mocks::async_di_container::MockAsyncDIContainer, +            >::new(Arc::new(di_container_mock), MockDependencyHistory::new);          binding_builder.to::<subjects_async::UserManager>().await?; @@ -575,14 +566,11 @@ mod tests              .return_once(|_name, _provider| ())              .once(); -        let binding_builder = AsyncBindingBuilder::< -            IUserManagerFactory, -            mocks::async_di_container::MockAsyncDIContainer<mocks::MockDependencyHistory>, -            mocks::MockDependencyHistory, -        >::new( -            Arc::new(di_container_mock), -            mocks::MockDependencyHistory::new, -        ); +        let binding_builder = +            AsyncBindingBuilder::< +                IUserManagerFactory, +                mocks::async_di_container::MockAsyncDIContainer, +            >::new(Arc::new(di_container_mock), MockDependencyHistory::new);          binding_builder              .to_factory(&|_| { @@ -624,14 +612,11 @@ mod tests              .return_once(|_name, _provider| ())              .once(); -        let binding_builder = AsyncBindingBuilder::< -            IUserManagerFactory, -            mocks::async_di_container::MockAsyncDIContainer<mocks::MockDependencyHistory>, -            mocks::MockDependencyHistory, -        >::new( -            Arc::new(di_container_mock), -            mocks::MockDependencyHistory::new, -        ); +        let binding_builder = +            AsyncBindingBuilder::< +                IUserManagerFactory, +                mocks::async_di_container::MockAsyncDIContainer, +            >::new(Arc::new(di_container_mock), MockDependencyHistory::new);          binding_builder              .to_async_factory(&|_| { @@ -673,14 +658,11 @@ mod tests              .return_once(|_name, _provider| ())              .once(); -        let binding_builder = AsyncBindingBuilder::< -            dyn subjects_async::IUserManager, -            mocks::async_di_container::MockAsyncDIContainer<mocks::MockDependencyHistory>, -            mocks::MockDependencyHistory, -        >::new( -            Arc::new(di_container_mock), -            mocks::MockDependencyHistory::new, -        ); +        let binding_builder = +            AsyncBindingBuilder::< +                dyn subjects_async::IUserManager, +                mocks::async_di_container::MockAsyncDIContainer, +            >::new(Arc::new(di_container_mock), MockDependencyHistory::new);          binding_builder              .to_default_factory(&|_| { @@ -723,14 +705,11 @@ mod tests              .return_once(|_name, _provider| ())              .once(); -        let binding_builder = AsyncBindingBuilder::< -            dyn subjects_async::IUserManager, -            mocks::async_di_container::MockAsyncDIContainer<mocks::MockDependencyHistory>, -            mocks::MockDependencyHistory, -        >::new( -            Arc::new(di_container_mock), -            mocks::MockDependencyHistory::new, -        ); +        let binding_builder = +            AsyncBindingBuilder::< +                dyn subjects_async::IUserManager, +                mocks::async_di_container::MockAsyncDIContainer, +            >::new(Arc::new(di_container_mock), MockDependencyHistory::new);          binding_builder              .to_async_default_factory(&|_| { diff --git a/src/di_container/asynchronous/binding/scope_configurator.rs b/src/di_container/asynchronous/binding/scope_configurator.rs index 023bb5e..a4a684b 100644 --- a/src/di_container/asynchronous/binding/scope_configurator.rs +++ b/src/di_container/asynchronous/binding/scope_configurator.rs @@ -4,51 +4,42 @@  use std::marker::PhantomData;  use std::sync::Arc; -use crate::dependency_history::IDependencyHistory;  use crate::di_container::asynchronous::binding::when_configurator::AsyncBindingWhenConfigurator;  use crate::di_container::asynchronous::IAsyncDIContainer;  use crate::errors::async_di_container::AsyncBindingScopeConfiguratorError;  use crate::interfaces::async_injectable::AsyncInjectable;  use crate::provider::r#async::{AsyncSingletonProvider, AsyncTransientTypeProvider};  use crate::ptr::ThreadsafeSingletonPtr; +use crate::util::use_dependency_history; + +use_dependency_history!();  /// Scope configurator for a binding for type `Interface` inside a [`IAsyncDIContainer`].  ///  /// [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer -pub struct AsyncBindingScopeConfigurator< -    Interface, -    Implementation, -    DIContainerType, -    DependencyHistoryType, -> where +pub struct AsyncBindingScopeConfigurator<Interface, Implementation, DIContainerType> +where      Interface: 'static + ?Sized + Send + Sync, -    Implementation: AsyncInjectable<DIContainerType, DependencyHistoryType>, -    DIContainerType: IAsyncDIContainer<DependencyHistoryType>, -    DependencyHistoryType: IDependencyHistory + Send + Sync, +    Implementation: AsyncInjectable<DIContainerType>, +    DIContainerType: IAsyncDIContainer,  {      di_container: Arc<DIContainerType>, -    dependency_history_factory: fn() -> DependencyHistoryType, +    dependency_history_factory: fn() -> DependencyHistory,      interface_phantom: PhantomData<Interface>,      implementation_phantom: PhantomData<Implementation>,  } -impl<Interface, Implementation, DIContainerType, DependencyHistoryType> -    AsyncBindingScopeConfigurator< -        Interface, -        Implementation, -        DIContainerType, -        DependencyHistoryType, -    > +impl<Interface, Implementation, DIContainerType> +    AsyncBindingScopeConfigurator<Interface, Implementation, DIContainerType>  where      Interface: 'static + ?Sized + Send + Sync, -    Implementation: AsyncInjectable<DIContainerType, DependencyHistoryType>, -    DIContainerType: IAsyncDIContainer<DependencyHistoryType>, -    DependencyHistoryType: IDependencyHistory + Send + Sync + 'static, +    Implementation: AsyncInjectable<DIContainerType>, +    DIContainerType: IAsyncDIContainer,  {      pub(crate) fn new(          di_container: Arc<DIContainerType>, -        dependency_history_factory: fn() -> DependencyHistoryType, +        dependency_history_factory: fn() -> DependencyHistory,      ) -> Self      {          Self { @@ -64,7 +55,7 @@ where      /// This is the default.      pub async fn in_transient_scope(          self, -    ) -> AsyncBindingWhenConfigurator<Interface, DIContainerType, DependencyHistoryType> +    ) -> AsyncBindingWhenConfigurator<Interface, DIContainerType>      {          self.set_in_transient_scope().await; @@ -78,7 +69,7 @@ where      pub async fn in_singleton_scope(          self,      ) -> Result< -        AsyncBindingWhenConfigurator<Interface, DIContainerType, DependencyHistoryType>, +        AsyncBindingWhenConfigurator<Interface, DIContainerType>,          AsyncBindingScopeConfiguratorError,      >      { @@ -107,11 +98,9 @@ where          self.di_container              .set_binding::<Interface>(                  None, -                Box::new(AsyncTransientTypeProvider::< -                    Implementation, -                    DIContainerType, -                    DependencyHistoryType, -                >::new()), +                Box::new( +                    AsyncTransientTypeProvider::<Implementation, DIContainerType>::new(), +                ),              )              .await;      } @@ -121,6 +110,7 @@ where  mod tests  {      use super::*; +    use crate::dependency_history::MockDependencyHistory;      use crate::test_utils::{mocks, subjects_async};      #[tokio::test] @@ -135,15 +125,12 @@ mod tests              .return_once(|_name, _provider| ())              .once(); -        let binding_scope_configurator = AsyncBindingScopeConfigurator::< -            dyn subjects_async::IUserManager, -            subjects_async::UserManager, -            mocks::async_di_container::MockAsyncDIContainer<mocks::MockDependencyHistory>, -            mocks::MockDependencyHistory, -        >::new( -            Arc::new(di_container_mock), -            mocks::MockDependencyHistory::new, -        ); +        let binding_scope_configurator = +            AsyncBindingScopeConfigurator::< +                dyn subjects_async::IUserManager, +                subjects_async::UserManager, +                mocks::async_di_container::MockAsyncDIContainer, +            >::new(Arc::new(di_container_mock), MockDependencyHistory::new);          binding_scope_configurator.in_transient_scope().await;      } @@ -160,15 +147,12 @@ mod tests              .return_once(|_name, _provider| ())              .once(); -        let binding_scope_configurator = AsyncBindingScopeConfigurator::< -            dyn subjects_async::IUserManager, -            subjects_async::UserManager, -            mocks::async_di_container::MockAsyncDIContainer<mocks::MockDependencyHistory>, -            mocks::MockDependencyHistory, -        >::new( -            Arc::new(di_container_mock), -            mocks::MockDependencyHistory::new, -        ); +        let binding_scope_configurator = +            AsyncBindingScopeConfigurator::< +                dyn subjects_async::IUserManager, +                subjects_async::UserManager, +                mocks::async_di_container::MockAsyncDIContainer, +            >::new(Arc::new(di_container_mock), MockDependencyHistory::new);          assert!(binding_scope_configurator              .in_singleton_scope() diff --git a/src/di_container/asynchronous/binding/when_configurator.rs b/src/di_container/asynchronous/binding/when_configurator.rs index 39e1807..d08239e 100644 --- a/src/di_container/asynchronous/binding/when_configurator.rs +++ b/src/di_container/asynchronous/binding/when_configurator.rs @@ -5,38 +5,32 @@ use std::any::type_name;  use std::marker::PhantomData;  use std::sync::Arc; -use crate::dependency_history::IDependencyHistory;  use crate::di_container::asynchronous::IAsyncDIContainer;  use crate::errors::async_di_container::AsyncBindingWhenConfiguratorError;  /// When configurator for a binding for type `Interface` inside a [`IAsyncDIContainer`].  ///  /// [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer -pub struct AsyncBindingWhenConfigurator<Interface, DIContainerType, DependencyHistoryType> +pub struct AsyncBindingWhenConfigurator<Interface, DIContainerType>  where      Interface: 'static + ?Sized + Send + Sync, -    DIContainerType: IAsyncDIContainer<DependencyHistoryType>, -    DependencyHistoryType: IDependencyHistory + Send + Sync, +    DIContainerType: IAsyncDIContainer,  {      di_container: Arc<DIContainerType>,      interface_phantom: PhantomData<Interface>, -    dependency_history_phantom: PhantomData<DependencyHistoryType>,  } -impl<Interface, DIContainerType, DependencyHistoryType> -    AsyncBindingWhenConfigurator<Interface, DIContainerType, DependencyHistoryType> +impl<Interface, DIContainerType> AsyncBindingWhenConfigurator<Interface, DIContainerType>  where      Interface: 'static + ?Sized + Send + Sync, -    DIContainerType: IAsyncDIContainer<DependencyHistoryType>, -    DependencyHistoryType: IDependencyHistory + Send + Sync, +    DIContainerType: IAsyncDIContainer,  {      pub(crate) fn new(di_container: Arc<DIContainerType>) -> Self      {          Self {              di_container,              interface_phantom: PhantomData, -            dependency_history_phantom: PhantomData,          }      } @@ -99,8 +93,7 @@ mod tests          let binding_when_configurator = AsyncBindingWhenConfigurator::<              dyn subjects_async::INumber, -            mocks::async_di_container::MockAsyncDIContainer<mocks::MockDependencyHistory>, -            mocks::MockDependencyHistory, +            mocks::async_di_container::MockAsyncDIContainer,          >::new(Arc::new(di_container_mock));          assert!(binding_when_configurator | 
