web-dev-qa-db-fra.com

Qu'est-ce que Castle Windsor et pourquoi devrais-je m'en soucier?

Je suis un développeur Windows de longue date, ayant fait mes armes dans win32 et le début de COM. Je travaille avec .Net depuis 2001, donc je parle assez bien C # et le CLR. Je n'avais jamais entendu parler de Castle Windsor avant de commencer à participer à Stack Overflow. J'ai lu le guide "Pour commencer" de Castle Windsor, mais ce n'est pas en cliquant.

Apprenez à ce vieux chien de nouvelles astuces et dites-moi pourquoi je devrais intégrer Castle Windsor à mes applications d'entreprise.

184
David Hill

Castle Windsor est un outil d'inversion 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. Un graphe d'objet entier créé par réflexion et configuration plutôt que par le "nouvel" opérateur.

Commencez ici: http://tech.groups.yahoo.com/group/altdotnet/message/10434


Imaginez que vous ayez un cours d'envoi d'e-mails. EmailSender. Imaginez que vous avez une autre classe WorkflowStepper. Dans WorkflowStepper, vous devez utiliser EmailSender.

Vous pouvez 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 changer ce mauvais garçon dans WorkflowStepper, vous venez de le transmettre au constructeur?

Donc, celui qui l'a appelé devait créer le nouvel EmailSender.

new WorkflowStepper(emailSender).Step()

Imaginez que vous ayez des centaines de ces petites classes qui n’ont qu’une responsabilité (google SRP) .. et que vous en utilisiez quelques-unes dans WorkflowStepper:

new WorkflowStepper(emailSender, alertRegistry, databaseConnection).Step()

Imaginez ne pas vous soucier des détails de EmailSender lorsque vous écrivez WorkflowStepper ou AlertRegistry

Vous vous inquiétez juste de la préoccupation avec laquelle vous travaillez.

Imaginez que tout ce graphe (arbre) d'objets et de dépendances soit câblé à RUN TIME, de sorte que lorsque vous faites ceci:

WorkflowStepper stepper = Container.Get<WorkflowStepper>();

vous obtenez une vraie affaire WorkflowStepper avec toutes les dépendances automatiquement remplies là où vous en avez besoin.

Il n'y a pas de new

C'est juste arrive - parce qu'il sait quoi a besoin de quoi.

Et vous pouvez écrire moins de défauts avec un code mieux conçu, DRY] de manière testable et répétable.

351
Matt Hinze

Je pense que 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 les 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 l’architecture, ce qui permet une certaine flexibilité car les cadres peuvent entrer et sortir.

Le meilleur moyen d’atteindre le but recherché par IoC (CW ou Ninject, etc.) est d’éliminer les politiques n ° 1 et n ° 2, évitant ainsi aux développeurs de mettre au premier plan la fausseté de la compréhension. Ces deux solutions ne semblent-elles pas liées à l'IoC? Elles sont :)

3
Mike Socha III

Mark Seemann a écrit un excellent livre sur DI (Dependency Injection), un sous-ensemble de IOC. Il compare également un certain nombre de conteneurs. Je ne peux pas assez recommander ce livre. Le livre s'appelle: "Dependency Injection in .Net" https://www.manning.com/books/dependency-injection-in-dot-net

3
IUnknown

Castle Windsor est Dependency Injection container. Cela signifie qu’à 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 consulter le didacticiel ci-dessous que j'ai suivi pour apprendre Castle Windsor.

lien .

J'espère que cela vous aidera.

2
Rakesh Burbure

Mettre tout simplement. Imaginez que votre code contienne une classe qui nécessite 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. Vous devez donc généralement refactoriser des charges de classes en cours de route pour simplement passer un peu de configuration jusqu'à l'endroit où l'instance est créée.

Donc, soit beaucoup de classes sont modifiées inutilement, vous regroupez les valeurs de configuration dans une seule grande classe de configuration également mauvaise ... ou, pire encore, Service Locator!

IoC permet à votre classe d’obtenir toutes ses dépendances sans tracas et gère plus explicitement la durée de vie des instances.

0
andrew pate