Quelqu'un aurait-il de bons exemples de conteneurs IoC (de préférence en c#) et comment et pourquoi les utiliser ? J'ai vérifié les page wiki et Ayende de l' exemple, mais je n'ai pas très bien le concept encore.
Et quand et où dois-je utiliser un conteneur IoC ?
J'ai utilisé StructureMap un peu. Le reste de votre question est assez chargé. Je vais essayer d'expliquer le concept dans un exemple.
Supposons que vous avez créé un site web qui accepte les paiements via PayPal. PayPal est maintenant une dépendance. Mais vous ne voulez pas de code à l'égard d'une PayPal fournisseur.
Au lieu de cela, vous devez créer et coder une interface comme ceci:
Tous vos PayPal code réside dans une classe qui implémente les méthodes de l'interface - PayPalPaymentProcessor, par exemple.
Maintenant, vous avez un objet que vous allez réellement utiliser pour traiter les paiements. Cela pourrait être un Contrôleur (ASP.NET MVC, ViewModel-WPF) ou tout simplement une classe comme illustré ici:
Ce morceau de code indique StructureMap "Quand vous voyez un constructeur qui a besoin d'un IPaymentProcessor, de retour d'un nouveau PayPalPaymentProcessor".
Tous cette cartographie est séparé de votre mise en œuvre du code et vous pourriez échanger à un moment plus tard, avec peu de refactoring nécessaire. Il y a beaucoup plus de Cio conteneurs, mais que le concept de base. Vous pouvez automatiser l'injection de constructeurs pour éviter les appels directement à ObjectFactory ainsi.
Espérons que cette aide!
Merci pour la belle exemple :). Je comprends que la dernière partie de la question est un peu large, mais je pense que vous avez répondu à cette partie ainsi.
Puis-je suggérer une correction? Ne pas le code où PaymentProcessor obtient une instance d'être comme ça? PaymentProcessor processor = ObjectFactory.GetInstance<IPaymentProcessor>();
Être conscient des limitations suivantes du conteneur IOC. Je dois avertir les gens, parce que je suis en train de vivre avec l'enfer de devoir soutenir un système à l'aide:
Les Exceptions levées par les constructeurs d'être avalé. Vous obtenez seulement le “ne pouvaient pas créer de dépendance” exception. Cela signifie que vous ne pouvez pas attraper prévu des exceptions si c'est le jeter dans un constructeur.
Ne peuvent pas intervenir via les constructeurs.
Oublier enregistrer une interface pauses à l'exécution au lieu de la compilation.
Toutes vos classes ne peut avoir qu'un constructeur et qu'ils ont tous à accepter des interfaces en tant que paramètres.
Toutes les dépendances sont instanciés de sorte que vous ne pouvez pas partager les instances, ce qui signifie que votre utilisation de la mémoire peuvent être volumineux rapidement.
Il fait la promotion d'un lot de interdepencies qui peut cacher le fait que vous code a transformé en spaghetti. Le rendant plus facile à démarrent des instances de tous ces interdepencies juste les masques qu'il y a un potentiel problème sous-jacent.
Vous ne pouvez pas gérer vous-même votre "Unité de Travail" très facilement parce que vous ne pouvez pas gérer une transaction à travers de multiples dépendances, puisque vous n'avez pas le contrôle de l'instanciation d'eux et passent dans le contexte de cette transaction.
Ne vous méprenez pas, j'adore l'injection de dépendance et de l'inversion de contrôle principe, mais je pense que le conteneur IOC pourrait être utilisée de manière responsable, mais juste être conscient de la batailles que vous devrez combattre en raison de la liste ci-dessus.
Lequel le contenant que vous utilisez? Il doit être vraiment terrible - pas largement utilisé conteneur aujourd'hui a ces limites (sauf les "oubliés de l'inscription" la question.)
Reste encore à voir un conteneur qui souffre de ces inconvénients - même les oubliés de l'enregistrement " n'est pas vraiment un argument valable puisque l'équivalent (sans Cio) est l'injection de valeur null dans le constructeur, qui ne parvient toujours pas à l'exécution.
Si vous voulez voir un conteneur IoC sous le capot, et aussi le point d'Injection de Dépendance), il est un excellent podcast sur DNR TV (Épisode 126) qui se passe vraiment dans les détails sur la façon de créer, pourquoi vous auriez besoin d'eux. C'est vraiment un merveilleux podcast. Une fois que vous avez regardé cette vidéo, vous serez en mesure de regarder L'unité,Ninject, StructureMap, etc et être en mesure de comprendre ce qu'ils font
Découvrez Printemps Cio (.net) java/.net conteneur. La documentation est assez bonne introduction.
Dans une brève:
Vous pouvez penser Cio comme une architecture qui encouragent: les objets de la composition et programmation d'une interface.
Cela vous donne la suivante:
la capacité de test de l'unité facilement votre code (vous pouvez tester facilement vos objets dans l'isolement en se moquant de toutes ses dépendances).
Extrêmement avance de configuration (parce que votre programme avec le Cio est juste tas d'objets et une configuration qui lui colle l'ensemble des objets).
La possibilité de prolonger ou de modifier des octets application compilée (ce qui est vrai pour Java je ne sais pas si c'est vrai pour les .net).
Nous utilisons Ninject en raison de son API simple et rapide de résolution des objets. Il est très bien documenté et tire profit de C# 3.0 fonctionnalités comme les lambda expressions spécification plus facile.
Vous pouvez trouver plusieurs vidéos explicatives sur Ninject ici
Êtes-vous en train de construire un conteneur IoC pourquoi ne pas utiliser l'un de ceux qui sont disponibles comme Spring.NET, StructureMap ou de l'Unité de Bloc d'Application? Ici est une liste de l'open-source Cio projets
Non, je n'essaie pas de construire un encore, c'est le concept, je suis en train d'essayer de mieux comprendre.
J'utilise normalement StructureMap - surtout parce que je suis familier avec la syntaxe. J'ai aussi entendu de bonnes choses sur autofac et je suis impatient d'essayer Ninject quand il frappe v2.
Vous voudrez peut-être jeter un oeil à cette réponse où je parle d'une utilisation de base d'un conteneur IoC (j'ai toujours pense que les choses sont plus facile à comprendre avec un exemple simple) - qui peut vous aider à comprendre les choses un peu plus. Fondamentalement, le conteneur IoC vous aide à construire des objets avec toutes les dépendances de la satisfaction, et vous permet de modifier vos dépendances avec un minimum de code de configuration.
Je suis à l'aide de l'Unité de mon conteneur IoC, mais la différence entre les conteneurs réside dans davantage que ce que vous pouvez faire avec DI.
DI (Dependency Injection) est principalement un moyen d'obtenir plus de couplage lâche entre les différents parties de votre programme. Donc, si vous avez écrit un jeu que vous voulez savoir comment il fonctionne, en utilisant DI, vous pouvez changer les personnages ou le moteur physique du jeu sans changer les autres parties du jeu, de sorte que, si quelqu'un paie plus d'argent qu'ils obtiennent le plus réaliste, le moteur ou le mieux les personnages, mais depuis rien d'autre est en train de changer, le test est plus simple.
Le test unitaire est aussi plus facile avec le DI comme vous pouvez le simulacre de la base de données, par exemple, par simple changement de la mise en œuvre qui sera utilisé par l'application, sans toucher à rien d'autre.
Si vous utilisez Spring.NET par exemple, vous aurez accès à un très puissant, mais il peut faire beaucoup que vous ne l'utilisez pas, de sorte recherchez quelque chose de plus petit. Je pense que la meilleure règle est de trouver la plus petite, la plus simple de mise en œuvre qui répond à vos besoins, et de l'utiliser.
J'ai utilisé StructureMap un peu. Le reste de votre question est assez chargé. Je vais essayer d'expliquer le concept dans un exemple.
Supposons que vous avez créé un site web qui accepte les paiements via PayPal. PayPal est maintenant une dépendance. Mais vous ne voulez pas de code à l'égard d'une PayPal fournisseur.
Au lieu de cela, vous devez créer et coder une interface comme ceci:
Tous vos PayPal code réside dans une classe qui implémente les méthodes de l'interface -
PayPalPaymentProcessor
, par exemple.Maintenant, vous avez un objet que vous allez réellement utiliser pour traiter les paiements. Cela pourrait être un Contrôleur (ASP.NET MVC, ViewModel-WPF) ou tout simplement une classe comme illustré ici:
C'est là un conteneur IoC vient dans. Au lieu de vous appeler le constructeur manuellement, vous laissez un conteneur IoC injecter la dépendance:
Ce morceau de code indique StructureMap "Quand vous voyez un constructeur qui a besoin d'un
IPaymentProcessor
, de retour d'un nouveauPayPalPaymentProcessor
".Tous cette cartographie est séparé de votre mise en œuvre du code et vous pourriez échanger à un moment plus tard, avec peu de refactoring nécessaire. Il y a beaucoup plus de Cio conteneurs, mais que le concept de base. Vous pouvez automatiser l'injection de constructeurs pour éviter les appels directement à
ObjectFactory
ainsi.Espérons que cette aide!
PaymentProcessor processor = ObjectFactory.GetInstance<IPaymentProcessor>();
Être conscient des limitations suivantes du conteneur IOC. Je dois avertir les gens, parce que je suis en train de vivre avec l'enfer de devoir soutenir un système à l'aide:
Ne vous méprenez pas, j'adore l'injection de dépendance et de l'inversion de contrôle principe, mais je pense que le conteneur IOC pourrait être utilisée de manière responsable, mais juste être conscient de la batailles que vous devrez combattre en raison de la liste ci-dessus.
Si vous voulez voir un conteneur IoC sous le capot, et aussi le point d'Injection de Dépendance), il est un excellent podcast sur DNR TV (Épisode 126) qui se passe vraiment dans les détails sur la façon de créer, pourquoi vous auriez besoin d'eux. C'est vraiment un merveilleux podcast. Une fois que vous avez regardé cette vidéo, vous serez en mesure de regarder L'unité,Ninject, StructureMap, etc et être en mesure de comprendre ce qu'ils font
Découvrez Printemps Cio (.net) java/.net conteneur. La documentation est assez bonne introduction.
Dans une brève:
Vous pouvez penser Cio comme une architecture qui encouragent:
les objets de la composition et programmation d'une interface.
Cela vous donne la suivante:
la capacité de test de l'unité facilement votre code (vous pouvez tester facilement vos objets dans l'isolement en se moquant de toutes ses dépendances).
Extrêmement avance de configuration (parce que votre programme avec le Cio est juste tas d'objets et une configuration qui lui colle l'ensemble des objets).
La possibilité de prolonger ou de modifier des octets application compilée (ce qui est vrai pour Java je ne sais pas si c'est vrai pour les .net).
Nous utilisons Ninject en raison de son API simple et rapide de résolution des objets. Il est très bien documenté et tire profit de C# 3.0 fonctionnalités comme les lambda expressions spécification plus facile.
Vous pouvez trouver plusieurs vidéos explicatives sur Ninject ici
Êtes-vous en train de construire un conteneur IoC pourquoi ne pas utiliser l'un de ceux qui sont disponibles comme Spring.NET, StructureMap ou de l'Unité de Bloc d'Application? Ici est une liste de l'open-source Cio projets
J'utilise normalement StructureMap - surtout parce que je suis familier avec la syntaxe. J'ai aussi entendu de bonnes choses sur autofac et je suis impatient d'essayer Ninject quand il frappe v2.
Vous voudrez peut-être jeter un oeil à cette réponse où je parle d'une utilisation de base d'un conteneur IoC (j'ai toujours pense que les choses sont plus facile à comprendre avec un exemple simple) - qui peut vous aider à comprendre les choses un peu plus. Fondamentalement, le conteneur IoC vous aide à construire des objets avec toutes les dépendances de la satisfaction, et vous permet de modifier vos dépendances avec un minimum de code de configuration.
Essayez de lire Introduction à l'Unité de Bloc d'Application et dans ASP.NET Vitrine: l'Injection de Dépendance screencast vous pouvez en savoir plus sur l'Injection de Dépendance concepts.
Je suis à l'aide de l'Unité de mon conteneur IoC, mais la différence entre les conteneurs réside dans davantage que ce que vous pouvez faire avec DI.
DI (Dependency Injection) est principalement un moyen d'obtenir plus de couplage lâche entre les différents parties de votre programme. Donc, si vous avez écrit un jeu que vous voulez savoir comment il fonctionne, en utilisant DI, vous pouvez changer les personnages ou le moteur physique du jeu sans changer les autres parties du jeu, de sorte que, si quelqu'un paie plus d'argent qu'ils obtiennent le plus réaliste, le moteur ou le mieux les personnages, mais depuis rien d'autre est en train de changer, le test est plus simple.
Le test unitaire est aussi plus facile avec le DI comme vous pouvez le simulacre de la base de données, par exemple, par simple changement de la mise en œuvre qui sera utilisé par l'application, sans toucher à rien d'autre.
Si vous utilisez Spring.NET par exemple, vous aurez accès à un très puissant, mais il peut faire beaucoup que vous ne l'utilisez pas, de sorte recherchez quelque chose de plus petit. Je pense que la meilleure règle est de trouver la plus petite, la plus simple de mise en œuvre qui répond à vos besoins, et de l'utiliser.