inyeccion dependencias c# .net dependency-injection ioc-container late-binding

c# - dependencias - (Automático) Mecanismos de Unión de Inyección de Dependencia



inyeccion de dependencias c# (4)

Los dos mecanismos comunes para crear enlaces de inyección de dependencia, como a través de un contenedor IOC, provienen de una configuración XML o un bloque de código imperativo. En estos casos, el par de valores clave es explícito (es decir, clave = tipo solicitado, valor = tipo devuelto).

Aun así, hay un tercer enfoque "heurístico" en el que un contenedor de aplicación / IOC recibe solo claves [IMyClass] y el contenedor refleja luego un conjunto de dependencias de ensamblaje de aplicaciones para encontrar todas las clases concretas con nombre coincidente [MyClass]. Dicho de otra manera, los valores de "tipo de devolución" se descubren en lugar de declararse.

Lo que me gustaría saber es doble:

  1. ¿Qué contenedores de COI (u otras herramientas de enlace tardío) permiten el enfoque heurístico? ¿Este enfoque tiene un nombre más común?
  2. ¿Hay otras técnicas vinculantes, además de las tres enumeradas, que se utilizan en la práctica?

Como utilicé StructureMap un poco, sabría cómo hacer tal cosa con ese contenedor: básicamente sería una Convención de registro personalizada (desde la inicialización o un registro, vaya al bloque Scan-lambda y encuentre la "Convención"). "método).

Le permite ver los tipos reflejados y luego insertarlos en la configuración del contenedor como mejor le parezca. Debe permitir lo que estás tratando de hacer.


Esto se denomina configuración basada en la convención o registro automático y es compatible con estos Contenedores DI de .NET:

Los mecanismos de configuración más comunes utilizados para los Contenedores DI son

  • XML
  • Código como configuración
  • Configuración basada en convenciones

Un cuarto enfoque, pero poco común, es usar atributos. El marco de extensibilidad administrada es el ejemplo más destacado de este enfoque, que es más común en Java.


Lo que ustedes llaman un enfoque "heurístico" es lo que llamo convenciones. La mayoría de los contenedores IoC le permiten anular la forma en que resuelven los enlaces, lo que significa que puede introducir cualquier convención que desee. No hay tales convenciones predeterminadas que yo sepa. Por el contrario, la mayoría de los contenedores no hacen nada por defecto; es su trabajo decirles cómo resolver tipos, ya sea a través de un archivo de configuración o a través de un código.

Un ejemplo de una convención personalizada que encuentro es bastante común, lo que le ahorra muchas declaraciones: si el tipo solicitado es un tipo de interfaz que comienza con "I" y termina con "Servicio", intente crear y resolver un tipo con el mismo nombre aparte del "yo". Esto resolverá nombres como IFooService a FooService automágicamente. Además, puede introducir la lógica para decidir sobre diferentes servicios en diferentes contextos con bastante facilidad, y puede manejar tiempos de vida de las instancias de servicio en un lugar común.

Como puede anular cómo se vinculan la mayoría de los contenedores IoC, también puede introducir otros comportamientos. En general, sin embargo, en realidad hay dos opciones:

  1. Configurar en tiempo de ejecución (a través de archivos de configuración como archivos XML)
  2. Configure en tiempo de compilación (ya sea a través de una API declarativa tipo DSL o mediante convenciones personalizadas u otra forma de lógica personalizada)

Usualmente hice lo que describiste como un paso personalizado en la configuración. AFAIK no hay ningún contenedor que ofrezca una estrategia de este tipo (y en mi opinión no es una parte del contenedor, sino un elemento de configuración que debería ser externo a la responsabilidad del contenedor).