L'injection de dépendance est-elle utile en C ++
C# utilise l'Injection de Dépendance (DI) beaucoup de ont une lossless et testable plate-forme. Pour cela, j'ai besoin d'un interface
et peut-être un DI ou Inversion de Contrôle (IoC) conteneur pour résoudre mon cas.
Mais comment le faire en C++? J'ai lu un peu sur ce sujet, et il semble que l'injection de dépendance dans le C++ n'est pas un grand sujet, comme en C#. En C++, vous utilisez un référence à un objet - c'est la manière d'utiliser le DI en C++, non?
Si ma théorie avec les références sont correctes, est-il quelque chose comme un récipient dans lequel je peux résoudre toutes les références? En C#, j'ai un "bad class/bad project/assembly"
qui enregistre toutes mes instances en static récipient au début du programme. Ensuite, dans chaque classe, je suis en mesure d'instance de la statique conteneur et peut résoudre une instance spécifique, est-ce possible en C++?
Êtes-vous à l'aide de l'Injection de Dépendance (ou peu importe son nom) dans C++? Si oui, comment vous allez l'utiliser? Sont-il des similitudes avec le C#?
source d'informationauteur Marcel Hoffmann
Vous devez vous connecter pour publier un commentaire.
De la même manière. La différence est que lorsque vous "programme pour une interface" en C#, vous "programme d'une classe de base" en C++. En outre, vous avez des outils en C++ que vous n'avez pas en C# (par exemple, la politique des modèles en œuvre de l'injection de dépendances choisi au moment de la compilation).
Pas; ce n'est pas la façon d'utiliser DI, c'est un façon d'utiliser DI en C++.
Aussi considérer:
Si je comprends bien, vous avez mis toutes vos données dans le présent statique conteneur et de l'utiliser partout dans l'application. Si c'est le cas, alors vous n'avez pas à utiliser l'injection de dépendance correctement, parce que cela viole la Loi de Déméter.
Oui, il est parfaitement possible (mais vous ne devriez pas le faire, en raison de briser la loi de Déméter). Jetez un oeil à boost::any (cela vous permettra de stocker des objets hétérogènes dans un conteneur, comme le stockage d'objets par
object
de référence C#).Oui (et il est appelé l'injection de dépendance 🙂 ).
Comme je l'ai décrit ci-dessus (modèle de stratégie arguments, injecté foncteurs et les prédicats comme composants réutilisables, l'injection d'objets par référence, pointeur de pointeur intelligent ou de la valeur).
À l'aide de l'injection de dépendance est assez simple en C++. Il suffit de définir une interface (une classe de base abstraite pure) que vous utilisez comme référence ou un pointeur (ou pointeur intelligent) argument du constructeur ou de la fonction init de la classe que vous souhaitez dépendance injecter dans.
Puis, dans le test de l'unité, d'injecter un simulacre de l'objet (une instance d'une classe héritant de l'interface abstraite de la classe), et dans le code réel, injecter une instance de la classe réelle (également hériter de la même classe d'interface).
Easy-peasy.
Oui, l'injection de dépendance est utile en C++. Il n'ya aucune raison pourquoi il ne devrait pas être, car il ne marche pas besoin d'un langage spécifique ou de syntaxe, mais juste un objet de classe orientée architecture (au moins c'est probablement le cas le plus courant).
Alors qu'en C# il y a seulement des "pointeurs" pour les objets alloués dynamiquement, C++ dispose de plusieurs variantes, comme "normale", les variables locales, plusieurs sortes de pointeurs, références... en plus, le concept de la sémantique de déplacement est très pertinente pour ce.
Pas seulement. Vous pouvez utiliser ce que vous voulez aussi longtemps que vous pouvez transmettre quelque chose à une méthode de classe, et ce quelque chose existera aussi longtemps que la classe de l'objet. Tous les trois possibilités ci-dessus peuvent le faire (chacun d'eux, avec certaines restrictions)
Peut-être vous manque le point de dependeny injection. Ce n'est pas le même comme un tas de "global" des variables. Mais oui, bien sûr, cela est possible en C++. Il y a des classes, il n'y a
static
et c'est tout ce qui est nécessaire.Avec C++11 en tant que projet, limite j'ai fini par rouler mon propre. J'ai vaguement basé sur .NET Ninject API sans la Réflexion, bien sûr.
ServiceLocator
Note, bien que son nom ServiceLocator (puisqu'il ne fait pas de Dépendance de l'Injection elle-même) si vous utilisez la fonction lambda liaisons et de préférence ServiceLocator::Module de cours que vous obtenez de l'Injection (pas de réflexion à la lumière) et il fonctionne vraiment très bien (OMI)
Ce n'est pas DI est censé être utilisé, vous ne passez pas votre conteneur à tous de votre "consommation" de la classe. Dans un système bien conçu de l'application que vous venez de faire quelques résoudre dans le point d'entrée et c'est tout. La plupart du temps, le besoin d'un "résoudre" peut être remplacé par l'utilisation d'une usine qui sera enregistré puis injecté.
Vous aurez beaucoup de mal de tests de code en fonction d'une classe statique. Je le recommande si vous voulez vraiment vous injecter votre conteneur dans votre client de classe pour au moins instance et de l'injecter, statique des dépendances de l'enfer, ce serait plus facile de se moquer pour les tests unitaires.