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.
Respostas:
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
EmailSender
quando você está escrevendoWorkflowStepper
ouAlertRegistry
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
WorkflowStepper
com 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.
fonte
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.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
fonte
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 :)
fonte
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ê.
fonte
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.
fonte