Eu li em várias fontes, incluindo o blog 'Ploeh' de Mark Seemann, sobre como o posicionamento apropriado da raiz de composição de um contêiner de IoC é o mais próximo possível do ponto de entrada de um aplicativo.
No mundo .NET, esses aplicativos parecem comumente vistos como projetos da Web, projetos WPF, aplicativos de console, itens com uma interface de usuário típica (leia-se: não projetos de biblioteca).
É realmente contrário a esse sábio conselho colocar a raiz da composição no ponto de entrada de um projeto de biblioteca, quando representa o ponto de entrada lógico de um grupo de projetos de bibliotecas e o cliente de um grupo de projetos como este é o trabalho de outra pessoa , cujo autor não pode ou não adicionará a raiz da composição ao projeto (um projeto de interface do usuário ou ainda outro projeto de biblioteca)?
Estou familiarizado com o Ninject como uma implementação de contêiner de IoC, mas imagino que muitos outros funcionem da mesma maneira, pois podem procurar um módulo contendo todas as configurações de ligação necessárias. Isso significa que eu poderia colocar um módulo de ligação em seu próprio projeto de biblioteca para compilar com a saída do meu projeto de biblioteca principal e, se o cliente quisesse alterar a configuração (um cenário improvável no meu caso), ele poderia soltar uma dll de substituição para substituir o biblioteca com o módulo de ligação.
Isso parece evitar que os clientes mais comuns tenham que lidar com as raízes de injeção e composição de dependência e seria a API mais limpa para o grupo de projetos da biblioteca.
No entanto, isso parece ir contra a sabedoria convencional sobre o assunto. Será que a maioria dos conselhos lá fora pressupõe que o desenvolvedor também tenha alguma coordenação com o desenvolvimento do (s) projeto (s) da interface do usuário, e não o meu caso, no qual estou apenas desenvolvendo bibliotecas para que outros possam usar?
A beleza das bibliotecas externas é que elas devem fazer o que dizem que fariam, enquanto expõem uma interface simples e direta. O quão complexo é realmente fazê-lo, não deve ser da conta do desenvolvedor que o implementa. Se o DI realmente tornar o trabalho do desenvolvedor da API menos complexo, faz 100% de sentido usá-lo, desde que seja usado corretamente e seu módulo seja declarado no ponto de entrada da API. No desenvolvimento de um aplicativo MVC recentemente, abstraí a camada de dados usando um padrão de repositório e ainda mais abstraia colocando uma camada de serviço entre o aplicativo MVC e a camada de repositório, ambos projetos de Biblioteca de Classes. Eu tinha uma interface ICache mapeada para uma classe de cache para o meu contexto de serviço. Inicialmente, eu o implementei usando MVC.Web.Cache, mas em uma iteração posterior, troquei por System.runtime. cache e você pode apenas imaginar o quão grande seria a escala desse Refatorador sem meu DI utilizado. Então meu conselho; "Vá em frente".
fonte