Che cos'è Castle Windsor e perché dovrei preoccuparmene?


191

Sono uno sviluppatore di Windows da molto tempo, dopo essermi tagliato i denti su Win32 e all'inizio di COM. Lavoro con .NET dal 2001, quindi sono abbastanza fluente in C # e CLR. Non avevo mai sentito parlare di Castle Windsor fino a quando non ho iniziato a partecipare a Stack Overflow. Ho letto la guida "Guida introduttiva" di Castle Windsor, ma non fa clic.

Insegna a questo vecchio cane nuovi trucchi e dimmi perché dovrei integrare Castle Windsor nelle mie app aziendali.


1
Leggi su Inversion of Control. È molto utile per aiutarti a disaccoppiare le dipendenze, che ti aiuterà molto nella scrittura di unit test, per cominciare.
Dan Csharpster,

Risposte:


360

Castle Windsor è un'inversione di strumento di controllo. Ce ne sono altri simili.

Può darti oggetti con dipendenze precostruite e precablate proprio lì. Un intero oggetto grafico creato tramite la riflessione e la configurazione anziché il "nuovo" operatore.

Inizia qui: http://tech.groups.yahoo.com/group/altdotnet/message/10434


Immagina di avere un corso di invio di email. EmailSender. Immagina di avere un'altra classe WorkflowStepper. All'interno di WorkflowStepper devi usare EmailSender.

Potresti sempre dire new EmailSender().Send(emailMessage);

ma questo - l'uso di new- crea un GIUNTO ATTIVO che è difficile da cambiare. (questo è un piccolo esempio inventato dopo tutto)

E se, invece di rinnovare questo cattivo ragazzo all'interno di WorkflowStepper, lo avessi appena passato al costruttore?

Quindi, chiunque lo chiamasse doveva rinnovare EmailSender.

new WorkflowStepper(emailSender).Step()

Immagina di avere centinaia di queste piccole classi che hanno solo una responsabilità (google SRP) .. e ne usi alcune in WorkflowStepper:

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

Immagina di non preoccuparti dei dettagli di EmailSenderquando stai scrivendo WorkflowStepperoAlertRegistry

Ti preoccupi solo della preoccupazione con cui stai lavorando.

Immagina che l'intero grafico (albero) di oggetti e dipendenze venga cablato a RUN TIME, in modo che quando lo fai:

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

ottieni un vero affare WorkflowSteppercon tutte le dipendenze compilate automaticamente dove ti servono.

Non c'è new

Succede e basta , perché sa cosa ha bisogno di cosa.

E puoi scrivere meno difetti con un codice DRY meglio progettato in un modo testabile e ripetibile.


30
ECCEZIONALE! Ben scritta! ADESSO ne sono entusiasta.
David Hill,

1
Grazie. C'è molto di più. Ho scelto un esempio molto semplice e dolorosamente concreto. È possibile utilizzare le interfacce per cambiare le implementazioni. È possibile configurare automaticamente interi assiemi. Puoi specificare cicli di vita come singleton o per-http-request, ecc. Continua: cambierà il tuo lavoro.
Matt Hinze,

6
E per aiutare la gente di Java: questa è Guice per .NET ;-)
Mark Renouf,

5
Trovo che nella mia esperienza sia più difficile eseguire il debug perché dove sono inizializzati gli oggetti ?? - In un grande progetto è difficile trovare la radice dell'inizializzazione. Preferisco il vecchio modo di usare new, so dove tutto è allora. Inoltre non mi piace l'idea di usare le riflessioni ed è davvero una scatola nera, codice che non possediamo e quindi non capiamo del tutto.
Luke T O'Brien,

1
@nashwan Sì, sto scrivendo unit test, ma i principi di IoC / DI possono essere applicati senza Castle Windsor o qualsiasi framework di terze parti, per me aggiunge solo un'altra dipendenza, questo era il punto del mio commento. Non vedo i vantaggi di Castle Windsor.
Luke T O'Brien,


3

Penso che l'IoC sia un trampolino di lancio nella giusta direzione sulla strada verso una maggiore produttività e godimento del team di sviluppo (inclusi PM, BA e BO). Aiuta a stabilire una separazione delle preoccupazioni tra gli sviluppatori e per i test. Dà tranquillità quando si progetta, il che consente flessibilità in quanto i quadri possono entrare e uscire.

Il modo migliore per raggiungere l'obiettivo che IoC (CW o Ninject ecc.) Prende a pugni è eliminare la politica n. 1 e n. 2 per eliminare la necessità che gli sviluppatori mettano sulla facciata della falsa comprensione durante lo sviluppo. Queste due soluzioni non sembrano correlate all'IoC? Loro sono :)


3

Castle Windsor è Dependency Injection container. Significa che con l'aiuto di questo puoi iniettare le tue dipendenze e usarle senza crearle con l'aiuto di una nuova parola chiave. ad es. considera di aver scritto un repository o un servizio e desideri utilizzarlo in molti luoghi, devi prima registrare il tuo servizio / repository e puoi iniziare a usarlo dopo averlo iniettato nel luogo richiesto. Puoi dare un'occhiata al tutorial qui sotto che ho seguito per imparare il castello di Windsor.

collegamento .

Spero che ti possa aiutare.


1

In poche parole. Immagina di avere qualche classe sepolta nel tuo codice che necessita di alcuni semplici valori di configurazione per fare il suo lavoro. Ciò significa che tutto ciò che crea un'istanza di quella classe deve ottenere tali dipendenze, quindi di solito si finisce per rifattorizzare un sacco di classi lungo la strada per passare un po 'di configurazione fino a dove viene creata l'istanza.

Quindi o molte classi vengono inutilmente modificate, raggruppi i valori di configurazione in una grande classe di configurazione che è anche cattiva ... o peggio ancora vai Service Locator!

IoC consente alla tua classe di ottenere tutte le sue dipendenze senza quella seccatura e gestisce la vita delle istanze in modo più esplicito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.