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

191

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.

David Hill
la source
1
Renseignez-vous sur l'inversion de contrôle. C'est très utile pour vous aider à découpler les dépendances, ce qui vous aidera beaucoup à écrire des tests unitaires, pour commencer.
Dan Csharpster

Réponses:

360

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 EmailSendermoment où vous écrivez WorkflowStepperouAlertRegistry

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 WorkflowStepperavec 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.

Matt Hinze
la source
30
IMPRESSIONNANT! Bien écrit! MAINTENANT, j'en suis ravi.
David Hill
1
Merci. Il y a beaucoup plus à faire. J'ai choisi un exemple très simple et douloureusement concret. Vous pouvez utiliser des interfaces pour changer d'implémentation. Vous pouvez configurer automatiquement des assemblys entiers. Vous pouvez spécifier des cycles de vie comme singleton ou par requête http, etc. Continuez - cela changera votre travail.
Matt Hinze
6
Et pour aider les gens de Java: Ceci est Guice pour .NET ;-)
Mark Renouf
5
Je trouve que d'après mon expérience, il est plus difficile de déboguer car où sont les objets initialisés ?? - Dans un grand projet, il est difficile de trouver la racine de l'initialisation. Je préfère la manière à l'ancienne d'utiliser 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.
Luke T O'Brien
1
@nashwan Oui, j'écris des tests unitaires, mais les principes d'IoC / DI peuvent être appliqués sans Castle Windsor ou tout autre framework tiers, pour moi cela ajoute simplement une autre dépendance, c'était le point de mon commentaire. Je ne vois tout simplement pas les avantages de Castle Windsor.
Luke T O'Brien
4

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

Inconnu
la source
3

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 :)

Mike Socha III
la source
3

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.

Rakesh Burbure
la source
1

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.

andrew pate
la source