COI en tiempo de compilación

11

¿Alguien ha comenzado un proyecto para hacer IOC en tiempo de compilación (posiblemente usando Roslyn o Linq MethodInfo emit)?

Mi experiencia con los contenedores de COI ha sido excelente hasta ahora, dejando al descubierto algunos pequeños problemas.

  1. Muchos contenedores IOC tardan en iniciarse, ya que gran parte de la lógica de resolución ocurre aquí
  2. A menudo es difícil garantizar que la resolución sea posible, ya que la compilación ya no garantiza que se pueda llamar al constructor
  3. A menudo, los contenedores de COI agregan una pequeña sobrecarga al tiempo de ejecución (algunos ni siquiera son pequeños, a menudo los que se inician rápidamente se ejecutan lentamente)

Me parece que la solución ideal sería agregar un paso de compilación a la cadena de compilación que agregue una clase Factory en lugar de IOC.

¿Alguien ha hecho esto antes? ¿Si no, porque no?

Letras
fuente

Respuestas:

4

Hacer esto no debería ser un problema. Simplemente ejecute la misma lógica de IoC y, en lugar de crear instancias de las clases, emite código que crea instancias.

Pero al hacer esto, está eliminando una gran ventaja de IoC: la capacidad de cambiar la composición de los componentes sin tener que volver a compilar toda la aplicación. Simplemente reemplazando la configuración, puede hacer que la aplicación use diferentes servicios o fuentes de datos. Y aunque todavía no he visto una aplicación que haga un uso completo de esta capacidad, sigue siendo una parte importante del éxito de IoC.

Eufórico
fuente
Sí, sé que es posible. Pero todavía tengo que ver un contenedor de IoC que lo haga. También he notado que la tendencia actual parece ser hacia el registro en el código (API fluidas). Dado eso, estoy considerando escribir dicho contenedor IoC.
ArTs
Me parece recordar que Hiro ( github.com/philiplaureano/Hiro ) podría hacer sus cosas en el momento de la compilación.
lzcd
2
"Pero al hacer esto, está eliminando una gran ventaja de IoC: la capacidad de cambiar la composición de los componentes sin tener que volver a compilar toda la aplicación". Me parece que aplicar esto a toda la aplicación es excesivo; está convirtiendo cada parte de la aplicación en un complemento. Además, ambas técnicas deberían poder coexistir: no hay razón para que no pueda conectar algunos de los componentes en tiempo de compilación y otros en tiempo de ejecución.
Doval
No veo cómo es una gran ventaja. ¿En qué contexto está reemplazando completamente los componentes en tiempo de ejecución? ¿Algunos casos de uso de configuración tal vez?
andyczerwonka
4

Dagger para Java / Android hace eso. Se sacrifica algo de magia en tiempo de ejecución (como la de Guice) para ofrecer una experiencia de codegen en tiempo de compilación casi completa, incluida la conversión de la mayoría de los errores de tiempo de ejecución en errores de compilación.

Sería genial en .NET también.

orip
fuente