COI em tempo de compilação


11

Alguém já iniciou um projeto para executar o COI em tempo de compilação (possivelmente usando a emissão de Roslyn ou Linq MethodInfo)?

Minha experiência com contêineres do COI até agora tem sido ótima, revelando alguns pequenos problemas

  1. Muitos contêineres do COI demoram a iniciar, pois grande parte da lógica de resolução ocorre aqui
  2. Muitas vezes, é difícil garantir que a resolução seja possível, pois a compilação não garante mais que o construtor possa ser chamado
  3. Freqüentemente, os contêineres do IOC adicionam uma pequena sobrecarga ao tempo de execução (alguns nem são pequenos, geralmente os que iniciam rapidamente são executados lentamente)

Parece-me que a solução ideal seria adicionar uma etapa de compilação à cadeia de compilação que adiciona uma classe Factory em vez de IOC.

Alguém já fez isso antes? Se não, por que não?

Respostas:


4

Fazer isso não deve ser um problema. Basta executar a mesma lógica de IoC e, em vez de instanciar as classes, você emite um código que faz a instanciação.

Mas, ao fazer isso, você está removendo uma enorme vantagem da IoC: capacidade de alterar a forma como os coponentes são compostos sem precisar recompilar o aplicativo inteiro. Apenas substituindo a configuração, você pode fazer com que o aplicativo use serviços ou fontes de dados diferentes. E embora eu ainda precise ver um aplicativo que faça uso total desse recurso, ele ainda é parte importante do sucesso da IoC.


Sim, eu sei que é possível. Mas ainda tenho que ver um contêiner de IoC que faz isso. Também observei que a tendência atual parece ser o registro em código (APIs fluentes). Dado isso, estou pensando em escrever o referido contêiner IoC.
precisa saber é

Eu me lembro que o Hiro ( github.com/philiplaureano/Hiro ) pode fazer suas coisas em tempo de compilação.
Lzcd

2
"Mas, ao fazer isso, você está removendo uma enorme vantagem da IoC: capacidade de alterar a forma como os coponentes são compostos sem precisar recompilar o aplicativo inteiro". Parece-me que aplicar isso a todo o aplicativo é um exagero; você está transformando cada parte do aplicativo em um plug-in. Além disso, ambas as técnicas devem poder coexistir - não há motivo para você não poder conectar alguns dos componentes em tempo de compilação e outros em tempo de execução.
Doval

Não vejo como isso é uma enorme vantagem. Em que contexto você está substituindo completamente os componentes em tempo de execução? Alguns casos de uso de configuração, talvez?
precisa saber é o seguinte

4

O Dagger para Java / Android faz isso. Ele sacrifica um pouco da mágica do tempo de execução (como a de Guice) para oferecer uma experiência de codegen quase completamente em tempo de compilação, incluindo a conversão da maioria dos erros de tempo de execução em erros de compilação.

Seria legal no .NET também.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.