12#ifndef ARCANE_UTILS_INTERNAL_DEPENDENCYINJECTION_H
13#define ARCANE_UTILS_INTERNAL_DEPENDENCYINJECTION_H
21#include "arcane/utils/Ref.h"
22#include "arcane/utils/ExternalRef.h"
23#include "arcane/utils/GenericRegisterer.h"
28#include "arcane/utils/NotImplementedException.h"
43namespace Arcane::DependencyInjection
48namespace Arcane::DependencyInjection::impl
51class IInstanceFactory;
52template <
typename InterfaceType>
53class IConcreteFactory;
54class ConcreteFactoryTypeInfo;
62namespace Arcane::DependencyInjection
72 virtual bool hasName(
const String& str)
const = 0;
73 virtual bool hasTypeInfo(
const std::type_info&
tinfo)
const = 0;
94 const char* name()
const {
return m_name; }
109namespace Arcane::DependencyInjection::impl
126 template <
typename Type>
static TypeInfo create()
130 const TraceInfo& traceInfo()
const {
return m_trace_info; }
131 const std::type_info& stdTypeInfo()
const {
return m_type_info; }
136 const std::type_info& m_type_info;
153 : m_interface_info(a)
155 , m_constructor_info(
c)
160 template <
typename InterfaceType,
typename ConcreteType,
typename ConstructorType>
164 TypeInfo::create<ConcreteType>(),
165 TypeInfo::create<ConstructorType>());
167 const TypeInfo& interfaceTypeInfo()
const {
return m_interface_info; }
168 const TypeInfo& concreteTypeInfo()
const {
return m_concrete_info; }
169 const TypeInfo& constructorTypeInfo()
const {
return m_constructor_info; }
184template <
typename InterfaceType>
201template <
typename InterfaceType>
219 bool hasName(
const String& str)
const override {
return m_name == str; }
234template <
typename Type>
240 virtual Type instance()
const = 0;
249template <
typename Type>
266 Type instance()
const override {
return m_instance; }
267 bool hasName(
const String& str)
const override {
return m_name == str; }
316 void reset() { m_instance.reset(); }
341 virtual const FactoryInfo* factoryInfo()
const = 0;
345 virtual Int32 nbConstructorArg()
const = 0;
366template <
typename InterfaceType>
380 delete m_sub_factory;
385 return _create(_createReference(
injector), name);
395 return m_factory_info;
400 return m_sub_factory->concreteFactoryInfo();
403 Int32 nbConstructorArg()
const override
405 return m_sub_factory->nbConstructorArg();
417 return m_sub_factory->createReference(
injector);
423 return InjectedInstanceRef::createRef(x);
439 virtual Int32 nbConstructorArg()
const = 0;
449template <
typename InterfaceType>
493 bool hasName(
const String& str)
const;
508 static BaseClass::Info m_global_registerer_info;
514 return m_global_registerer_info;
532 FactoryCreateFunc infoCreatorWithPropertyFunction() {
return m_factory_create_func; }
535 const char*
name() {
return m_name; }
541 FactoryCreateFunc m_factory_create_func =
nullptr;
542 const char* m_name =
nullptr;
553namespace Arcane::DependencyInjection
566 template <
class Type>
577 return i._getValue<
Type>(name);
582 template <
class Po
interType>
597 return i._getRef<PointerType>(name);
667 template <
typename Type>
void
673 template <
typename Type>
Type
676 return InjectorHelper<Type>::get(*
this, name);
698 auto*
t =
dynamic_cast<FactoryType*
>(v);
718 return dynamic_cast<FactoryType*
>(v) !=
nullptr;
723 String printFactories()
const;
725 void fillWithGlobalFactories();
737 IInstanceVisitorFunctor*
lambda);
738 Integer _nbValue()
const;
749 void _iterateFactories(
const String&
factory_name, IFactoryVisitorFunctor* functor)
const;
750 Integer _nbFactory()
const;
763 InstanceVisitorFunctor
ff(f);
766 return t->instance();
771 template <
typename Type>
Type
772 _getValue(
const String& instance_name)
774 using InjectedType = impl::IInjectedValueInstance<Type>;
775 InjectedType* t =
nullptr;
776 auto f = [&](IInjectedInstance* v) ->
bool {
777 t =
dynamic_cast<InjectedType*
>(v);
780 InstanceVisitorFunctor ff(f);
781 _iterateInstances(
typeid(
Type), instance_name, &ff);
783 return t->instance();
784 _doError(A_FUNCINFO,
"Can not find value for type");
786 [[noreturn]]
void _printValidImplementationAndThrow(
const TraceInfo& ti,
787 const String& implementation_name,
788 FactoryFilterFunc filter_func);
789 [[noreturn]]
void _doError(
const TraceInfo& ti,
const String& message);
797namespace Arcane::DependencyInjection::impl
816template <
typename... Args>
822 using ArgsType = std::tuple<Args...>;
827 template <std::
size_t I>
828 static auto _get(
Injector& i) -> std::tuple_element_t<I, ArgsType>
838 constexpr int tuple_size = std::tuple_size<ArgsType>();
839 static_assert(
tuple_size < 3,
"Too many arguments for createTuple (max=2)");
850 _doError1(
"Too many arguments for createTuple n={0} max=2",
tuple_size);
861template <
typename InterfaceType,
typename ConcreteType,
typename ConstructorType>
865 using Args =
typename ConstructorType::ArgsType;
877 return ConcreteFactoryTypeInfo::create<InterfaceType, ConcreteType, ConstructorType>();
879 Int32 nbConstructorArg()
const override
881 return std::tuple_size<Args>();
916 template <
typename ConcreteType,
typename ConstructorType>
void
932 if constexpr (
sizeof...(OtherInterfaces) > 0)
945template <
typename ConcreteType,
typename InterfaceList>
965 template <
typename ConstructorType>
void
989#define ARCANE_DI_CONSTRUCTOR(...) \
990 ::Arcane::DependencyInjection::impl::ConstructorRegisterer<__VA_ARGS__>()
992#define ARCANE_DI_EMPTY_CONSTRUCTOR(...) \
993 ::Arcane::DependencyInjection::impl::ConstructorRegisterer<>()
997#define ARCANE_DI_INTERFACES(...) \
998 ::Arcane::DependencyInjection::impl::InterfaceListRegisterer<__VA_ARGS__>
1000#define ARCANE_DI_REGISTER_PROVIDER(t_class, t_provider_property, t_interfaces, ...) \
1003 Arcane::DependencyInjection::impl::FactoryInfo* \
1004 ARCANE_JOIN_WITH_LINE(arcaneCreateDependencyInjectionProviderInfo##t_class)(const Arcane::DependencyInjection::ProviderProperty& property) \
1006 auto* si = Arcane::DependencyInjection::impl::FactoryInfo::create(property, __FILE__, __LINE__); \
1007 Arcane::DependencyInjection::impl::InjectionRegisterer<t_class, t_interfaces> injection_registerer; \
1008 injection_registerer.registerProviderInfo(si, __VA_ARGS__); \
1012 Arcane::DependencyInjection::impl::GlobalRegisterer ARCANE_EXPORT ARCANE_JOIN_WITH_LINE(globalServiceRegisterer##aclass)(&ARCANE_JOIN_WITH_LINE(arcaneCreateDependencyInjectionProviderInfo##t_class), t_provider_property)
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCCORE_DECLARE_REFERENCE_COUNTED_INCLASS_METHODS()
Macro pour déclarer les méthodes virtuelles gérant les compteurs de référence.
#define ARCCORE_DECLARE_REFERENCE_COUNTED_CLASS(class_name)
Macro pour déclarer qu'une classe utilise un compteur de référence.
#define ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS()
Macro pour définir les méthodes gérant les compteurs de référence.
Interface d'un fonctor pour appliqué à chaque fabrique.
Interface d'un fonctor pour appliqué à chaque fabrique.
Ref< InterfaceType > createInstance(const String &implementation_name, bool allow_null=false)
Créé une instance implémentant une interface.
Informations sur les types d'une fabrique.
Fabrique pour le type ConcreteType pour l'interface InterfaceType via le constructeur ConstructorType...
ConcreteType * _create(const Args &&tuple_args)
Ref< InterfaceType > createReference(Injector &injector) override
Créé une instance du service .
Classe permettant d'enregistrer un constructeur pour créer un objet via un Injector....
Informations pour une fabrique.
const char * name()
Nom du service.
Interface d'un fonctor de création d'une instance de service correspondant à l'interface InterfaceTyp...
virtual Ref< InterfaceType > createReference(Injector &)=0
Créé une instance du service .
Interface typée gérant l'instance d'un service.
Interface typée gérant une instance.
Fabrique pour une instance encapsulée par une référence (i.e Ref<T>).
Référence sur une instance injectée.
Interface typée gérant l'instance d'un service.
Interface typée gérant l'instance d'un service.
Classe permettant d'enregistrer des constructeurs pour créer un type ConcreteType implémentant les in...
void _create(FactoryInfo *si, const C1 &c1, const C2 &c2, const OtherConstructors &... args)
Surcharge pour 2 constructeurs ou plus.
void registerProviderInfo(FactoryInfo *si, const Constructors &... args)
Enregistre dans si les fabriques correspondentes aux constructeurs Constructors.
void _create(FactoryInfo *si, const ConstructorType &)
Surcharge pour 1 constructeur.
Classe permettant d'enregistrer la liste des interfaces d'un service. Interfaces contient la liste de...
void registerFactory(FactoryInfo *si)
Enregistre une fabrique.
Classe template pour gérer une liste globale permettant d'enregistrer des fabriques.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Gestion des références sur un objet externe.
Exception lorsqu'une fonction n'est pas implémentée.
Référence à une instance.
Implémentation thread-safe d'un compteur de référence.
Chaîne de caractères unicode.