Je suis un développeur Windows de longue date, ayant fait mes armes sur win32 et les premiers COM. Je travaille avec .NET depuis 2001, donc je parle assez couramment C # et CLR. Je n'avais jamais entendu parler de Castle Windsor avant de commencer à participer à Stack Overflow. J'ai lu le guide de démarrage de Castle Windsor, mais il ne clique pas.
Apprenez à ce vieux chien de nouvelles astuces et dites-moi pourquoi je devrais intégrer Castle Windsor dans mes applications d'entreprise.
Réponses:
Castle Windsor est une inversion de l'outil de contrôle. Il y en a d'autres comme ça.
Il peut vous donner des objets avec des dépendances pré-construites et pré-câblées directement là-dedans. Un graphe d'objets entier créé par réflexion et configuration plutôt que par l'opérateur "nouveau".
Commencez ici: http://tech.groups.yahoo.com/group/altdotnet/message/10434
Imaginez que vous ayez une classe d'envoi d'e-mails. EmailSender. Imaginez que vous avez une autre classe WorkflowStepper. Dans WorkflowStepper, vous devez utiliser EmailSender.
Tu pourrais toujours dire
new EmailSender().Send(emailMessage);
mais cela - l'utilisation de
new
- crée un COUPLAGE ÉTROIT qui est difficile à changer. (c'est un petit exemple artificiel après tout)Alors que se passe-t-il si, au lieu de créer ce mauvais garçon dans WorkflowStepper, vous le passiez simplement au constructeur?
Donc, celui qui l'appelait devait renouveler EmailSender.
new WorkflowStepper(emailSender).Step()
Imaginez que vous ayez des centaines de ces petites classes qui n'ont qu'une seule responsabilité (google SRP) ... et que vous en utilisez quelques-unes dans WorkflowStepper:
new WorkflowStepper(emailSender, alertRegistry, databaseConnection).Step()
Imaginez ne pas vous soucier des détails du
EmailSender
moment où vous écrivezWorkflowStepper
ouAlertRegistry
Vous vous inquiétez simplement du problème avec lequel vous travaillez.
Imaginez que tout ce graphique (arbre) d'objets et de dépendances soit câblé au TEMPS D'EXÉCUTION, de sorte que lorsque vous faites cela:
WorkflowStepper stepper = Container.Get<WorkflowStepper>();
vous obtenez une vraie affaire
WorkflowStepper
avec toutes les dépendances remplies automatiquement là où vous en avez besoin.Il n'y a pas
new
Cela arrive simplement - parce qu'il sait ce qui a besoin de quoi.
Et vous pouvez écrire moins de défauts avec un code DRY mieux conçu de manière testable et répétable.
la source
new
, je sais où tout est alors. Je n'aime pas non plus l'idée d'utiliser des réflexions et c'est vraiment une boîte noire, du code que nous ne possédons pas et donc ne comprenons pas tout à fait.Mark Seemann a écrit un excellent livre sur DI (Dependency Injection) qui est un sous-ensemble de l'IOC. Il compare également un certain nombre de conteneurs. Je ne saurais trop recommander ce livre. Le nom du livre est: "Dependency Injection in .Net" https://www.manning.com/books/dependency-injection-in-dot-net
la source
Je pense que l'IoC est un tremplin dans la bonne direction sur la voie d'une plus grande productivité et du plaisir de l'équipe de développement (y compris PM, BA et BO). Cela aide à établir une séparation des préoccupations entre les développeurs et pour les tests. Cela donne la tranquillité d'esprit lors de la conception de l'architecture, ce qui permet une flexibilité car les cadres peuvent entrer et sortir.
La meilleure façon d'atteindre l'objectif que l'IoC (CW ou Ninject, etc.) tente de tenter est d'éliminer la politique n ° 1 et n ° 2 en supprimant le besoin pour les développeurs de mettre en avant la fausse compréhension lors du développement. Ces deux solutions ne semblent-elles pas liées à l'IoC? Elles sont :)
la source
Castle Windsor est
Dependency Injection container.
Cela signifie qu'avec l'aide de cela, vous pouvez injecter vos dépendances et les utiliser sans les créer à l'aide d'un nouveau mot-clé. Par exemple, considérez que vous avez écrit un référentiel ou un service et que vous souhaitez l'utiliser à de nombreux endroits, vous devez d'abord enregistrer votre service / référentiel et vous pouvez commencer à l'utiliser après l'avoir injecté à l'emplacement requis. Vous pouvez jeter un œil au tutoriel ci-dessous que j'ai suivi pour apprendre le château de Windsor.lien .
J'espère que cela vous aidera.
la source
Mettre tout simplement. Imaginez que vous ayez une classe enfouie dans votre code qui a besoin de quelques valeurs de configuration simples pour faire son travail. Cela signifie que tout ce qui crée une instance de cette classe doit obtenir ces dépendances, donc vous finissez généralement par devoir refactoriser des charges de classes en cours de route pour simplement passer un peu de configuration à l'endroit où l'instance est créée.
Donc, soit beaucoup de classes sont inutilement modifiées, vous regroupez les valeurs de configuration dans une seule grande classe de configuration qui est également mauvaise ... ou pire, allez toujours au Service Locator!
IoC permet à votre classe d'obtenir toutes ses dépendances sans ce tracas, et gère également la durée de vie des instances de manière plus explicite.
la source