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?