Confrontando Castle Windsor, Unity e StructureMap

In un seguito alla dichiarazione di Krzysztof secondo cui Windsor fa molto più di altri IoC, volevo capire in che modo questi IoC si accumulano l’uno contro l’altro e i vantaggi / servizi aggiuntivi che il castello offre a Windsor.

Ci sono dei confronti? Qualcuno può aiutarmi a capire le funzionalità aggiuntive che Castle Windsor fornisce su altri IoC

Vedi qui e qui per un confronto tecnico abbastanza approfondito di diversi contenitori IoC, anche se un po ‘obsoleto (sono di prima di Windsor 2.0)

Tuttavia, non penso che ci siano davvero delle caratteristiche vitali che Windsor offre e altri contenitori no. Windsor , StructureMap , Spring.NET sono in circolazione da diversi anni e sono stati utilizzati in molti progetti in questi anni, quindi ora sono molto maturi. I contenitori più recenti, come Autofac , Unity , Ninject e SimpleInjector, si basano su quell’esperienza precedente e quindi non mancheranno nemmeno queste caratteristiche vitali.

Ora la parte più soggettiva della risposta: mi piace pensare che Windsor abbia un bel mix di moduli di usabilità, estensibilità e integrazione.

Usabilità : ad esempio, è ansible utilizzare la registrazione XML e / o del codice (al giorno d’oggi ha anche un’API fluente come la maggior parte dei contenitori).

Estensibilità : un sacco di punti di estensione che è ansible utilizzare per personalizzare o sovrascrivere praticamente qualsiasi comportamento predefinito.

Integrazione : Windsor ha molte strutture (moduli) che consentono una facile integrazione con altri framework / librerie. Altre integrazioni includono ASP.NET MVC , MonoRail , Workflow Foundation , NServiceBus , MassTransit , Rhino Service Bus , Quartz.Net , SolrNet , SolrSharp , Servizi fax di Windows .

Questa serie di articoli copre molte sottigliezze e punti di estensione di Windsor.

Nota che non sto dicendo che altri contenitori non offrono cose simili! Anche se ne hai selezionato uno e in seguito hai scoperto che manca un’integrazione, di solito non è difficile codificarlo da solo.

In conclusione: non penso che tu possa sbagliare con nessuno dei principali contenitori IoC, a patto di strutturare correttamente il tuo codice (ad es. Evitare l’anti-pattern del localizzatore di servizi).

Per me ci sono due caratteristiche killer di Windsor che non credo creino la maggior parte degli altri contenitori.

  • Capacità di lavorare in modo agnostico in un contenitore – questo significa che il tuo contenitore può eseguire il boot di tutto il codice per te e puoi trarre il massimo vantaggio dalle sue ricche funzionalità senza mai fare riferimento a alcuno degli assembly Castle. *. Dll negli assembly non-infrastruttura. Questo grazie a funzionalità come Lazy Component Loaders, DynamicParameters e Typed Factory Facility, che non ti impediscono di sfruttare le funzionalità avanzate del contenitore, evitando di codificare manualmente il livello di integrazione o utilizzando Service Locator, che come @ploeh ha scritto è un modello anti.

  • ecosistema di estensibilità / estensioni molto ricco che può darti funzionalità davvero potenti e ridurre notevolmente la quantità di codice idraulico che devi scrivere. Questo potrebbe non sembrare potente, ma lo apprezzerai una volta che avrai approfittato di cose come WCF Facility in un progetto, e poi in un altro non sarai in grado di usarlo. La parte di estensibilità significa che, mentre Windsor non prova (questo è il suo objective di progettazione) per risolvere ogni problema che si può avere fuori dalla scatola, è molto estensibile, il che significa che è ansible modificarlo e ruotarlo per fare quasi tutto ciò che potrebbe essere necessario.

A parte questo, mi è sempre piaciuto il modo in cui Windsor funziona come previsto ( contrariamente ad altri contenitori ) e come risolve le piccole cose . Ad esempio, la creazione di servizi decorati è molto semplice. Mi piace anche molto la fluente API di registrazione, che funziona molto bene per entrambi gli scenari semplici, e non diventa troppo complicata e complicata quando si vuole fare qualcosa di avanzato. Inoltre un sacco di altre piccole cose anche se qui le cose possono essere piuttosto soggettive.