std::shared_ptr< typename RegistrationBuilder< T, RegistrationStyleT >::ParentType > RegistrationBuilder< T, RegistrationStyleT >::instancePerDependency() { auto& rd = registrationData(); rd.sharing(InstanceSharing::None); rd.lifetime(std::make_shared< CurrentLifetimeScope >()); return this->shared_from_this(); }
typename RegistrationBuilder< T, RegistrationStyleT >::ParentType& RegistrationBuilder< T, RegistrationStyleT >::instancePerLifetimeScope() { auto& rd = registrationData(); rd.sharing(InstanceSharing::Shared); rd.lifetime(std::make_shared< CurrentLifetimeScope >()); return *this; }
std::shared_ptr< typename RegistrationBuilder< T, RegistrationStyleT >::ParentType > RegistrationBuilder< T, RegistrationStyleT >::singleInstance() { auto& rd = registrationData(); rd.sharing(InstanceSharing::Shared); rd.lifetime(std::make_shared< RootScopeLifetime >()); return this->shared_from_this(); }
typename ContainerBuilder::RegistrationBuilderInterface< T >::Type& ContainerBuilder::registerInstance(const std::shared_ptr< T >& instance) { static_assert(!std::is_pod< T >::value || std::is_empty< T >::value || std::is_class< T >::value, "ContainerBuilder::registerType< T >(std::shared_ptr< T > instance) is incompatible with POD types."); auto rb = RegistrationBuilderFactory< ContainerBuilder::RegistrationBuilderInterface >::forInstance(instance); rb->singleInstance(); registerCallback( [rb](const std::shared_ptr< IComponentRegistry >& cr) { auto rootScopeLifetime = std::dynamic_pointer_cast< RootScopeLifetime >(rb->registrationData().lifetime()); if (rootScopeLifetime == nullptr || rb->registrationData().sharing() != InstanceSharing::Shared) throw std::logic_error("Instance registration is single instance only."); RegistrationBuilderFactory< ContainerBuilder::RegistrationBuilderInterface >::registerSingleComponent< T >(cr, rb); }); return *rb; }