O que é o Castelo Windsor e por que devo me importar?

190

Sou desenvolvedor de longa data do Windows, tendo cortado meus dentes no win32 e no COM inicial. Trabalho com .NET desde 2001, por isso sou bastante fluente em C # e CLR. Eu nunca tinha ouvido falar de Castle Windsor até começar a participar do Stack Overflow. Eu li o guia "Introdução" do Castle Windsor, mas não está clicando.

Ensine novos truques a esse cachorro velho e me diga por que eu deveria integrar o Castle Windsor aos meus aplicativos empresariais.

David Hill
fonte
1
Leia sobre Inversão de controle. É muito útil para ajudá-lo a dissociar dependências, o que o ajudará muito a escrever testes de unidade para iniciantes.
Dan Csharpster

Respostas:

358

Castle Windsor é uma inversão da ferramenta de controle. Existem outros assim.

Ele pode fornecer objetos com dependências pré-construídas e pré-cabeadas. Um gráfico de objeto inteiro criado via reflexão e configuração, e não pelo operador "novo".

Comece aqui: http://tech.groups.yahoo.com/group/altdotnet/message/10434


Imagine que você tem uma classe de envio de e-mail. EmailSender. Imagine que você tem outra classe WorkflowStepper. Dentro do WorkflowStepper, você precisa usar o EmailSender.

Você sempre pode dizer new EmailSender().Send(emailMessage);

mas isso - o uso de new- cria um ACOPLAMENTO apertado que é difícil de mudar. (este é um pequeno exemplo artificial, afinal)

E daí que, em vez de lançar esse garoto mau no WorkflowStepper, você o passasse para o construtor?

Então, quem quer que tenha telefonado precisa atualizar o EmailSender.

new WorkflowStepper(emailSender).Step()

Imagine que você tem centenas dessas pequenas classes que têm apenas uma responsabilidade (google SRP). E você usa algumas delas no WorkflowStepper:

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

Imagine não se preocupar com os detalhes de EmailSenderquando você está escrevendo WorkflowStepperouAlertRegistry

Você só se preocupa com a preocupação com a qual está trabalhando.

Imagine que todo esse gráfico (árvore) de objetos e dependências seja conectado em RUN TIME, para que, ao fazer isso:

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

você consegue um acordo real WorkflowSteppercom todas as dependências preenchidas automaticamente onde você precisar.

Não há new

Apenas acontece - porque sabe o que precisa de quê.

E você pode escrever menos defeitos com um código DRY melhor projetado, de maneira testável e repetível.

Matt Hinze
fonte
30
IMPRESSIONANTE! Bem escrito! Agora estou empolgado com isso.
David Hill
1
Obrigado. Há muito mais nisso. Escolhi um exemplo muito simples e dolorosamente concreto. Você pode usar interfaces para alternar implementações. Você pode configurar automaticamente montagens inteiras. Você pode especificar ciclos de vida como singleton ou solicitação por http, etc. Continue - isso mudará seu trabalho.
Matt Hinze
6
E para ajudar as pessoas Java: Esta é Guice para .NET ;-)
Mark Renouf
5
Acho que, na minha experiência, é mais difícil depurar porque onde estão os objetos inicializados? - Em um projeto grande, é difícil encontrar a raiz da inicialização. Eu prefiro a maneira antiquada de usar new, eu sei onde está tudo. Também não gosto da ideia de usar reflexões e é realmente uma caixa preta, código que não possuímos e, portanto, não entendemos completamente.
Luke T O'Brien /
1
@nashwan Sim, estou escrevendo teste de unidade, mas os princípios da IoC / DI podem ser aplicados sem o Castle Windsor ou qualquer estrutura de terceiros; para mim, isso apenas acrescenta outra dependência, que foi o ponto do meu comentário. Só não vejo as vantagens do castelo Windsor.
Luke T O'Brien
4

Mark Seemann escreveu e excelente livro sobre DI (Dependency Injection), que é um subconjunto do COI. Ele também compara vários contêineres. Não posso recomendar este livro o suficiente. O nome do livro é: "Injeção de Dependências em .Net" https://www.manning.com/books/dependency-injection-in-dot-net

IDesconhecido
fonte
3

Eu acho que a IoC é um trampolim na direção certa no caminho para uma maior produtividade e prazer da equipe de desenvolvimento (incluindo PM, BA e BOs). Isso ajuda a estabelecer uma separação de preocupações entre os desenvolvedores e os testes. Dá tranqüilidade ao projetar, o que permite flexibilidade, pois as estruturas podem entrar e sair.

A melhor maneira de atingir o objetivo que a IoC (CW ou Ninject etc.) leva a uma facada é eliminar as políticas 1 e 2, removendo a necessidade de os desenvolvedores colocarem a fachada do falso entendimento no desenvolvimento. Essas duas soluções não parecem relacionadas à IoC? Eles são :)

Mike Socha III
fonte
3

Castle Windsor is Dependency Injection container.Isso significa que, com a ajuda disso, você pode injetar suas dependências e usá-las sem criá-las com a ajuda de uma nova palavra-chave. Por exemplo, considere que você escreveu um repositório ou um serviço e deseja usá-lo em vários locais, primeiro registre seu serviço / repositório e poderá começar a usá-lo após injetá-lo no local necessário. Você pode dar uma olhada no tutorial abaixo, que eu segui para aprender o castelo windsor.

link .

Espero que ajude você.

Rakesh Burbure
fonte
1

Simplificando. Imagine que você tem alguma classe oculta no seu código que precisa de alguns valores simples de configuração para fazer seu trabalho. Isso significa que tudo o que cria uma instância dessa classe precisa obter essas dependências; portanto, você geralmente acaba refatorando várias classes ao longo do caminho para passar um pouco de configuração até onde a instância é criada.

Portanto, muitas classes são desnecessariamente alteradas, você agrupa os valores de configuração em uma grande classe de configuração que também é ruim ... ou pior ainda, no Service Locator!

O IoC permite que sua classe obtenha todas as suas dependências sem esse incômodo e também gerencia a vida útil das instâncias de forma mais explícita.

andrew pate
fonte