Estoy probando Ninject y estoy modificando el código que escribí con Structure Map para ver qué tan fácil es. En este código base, tengo un gráfico de objetos que tienen diferentes configuraciones a través de los registros del Mapa de Estructura y el que se utiliza en tiempo de ejecución mediante un valor en la base de datos (en este caso para retirar un cuerpo del servicio wcf con algunos objetos inyectados) . Entonces, por ejemplo (usando el código del Mapa de Estructura):Usando nombres para discriminar instancias usando IoC
El Registro 1 configura todos los valores predeterminados para los tipos IBusinessContext, IRules e ILogger. Esto simplemente agrega los tipos GenericContext/Logger/Rules junto a las interfaces sin ninguna otra especialización.
public GenericRegistry()
{
// Set up some generic bindings here
For<ILogger>().Use<Loggers.GenericLogger>();
For<IBusinessRule>().Use<Rules.StandardRule>();
For<IBusinessContext>().Use<Contexts.GenericBusinessContext>();
For<ILoggerContext>().Use<Loggers.GenericLoggerContext>();
}
Registro 2 juegos hasta IBusinessContext utilizar la clase SpecialisedContext y le dice al ctor utilizar SpecializedLogger. La instancia para IBusinessContext se llama "SpecializedContext".
public SpecializedRegistry()
{
// Old style syntax as it affects the default for IBusinessContext
// Perhaps a hint at what I'm doing?
InstanceOf<IBusinessContext>().Is.OfConcreteType<Contexts.SpecializedBusinessContext>().Named(SpecializedInstanceName).Ctor<ILogger>().Is<Loggers.SpecialisedLogger>();
}
Todo esto funciona como se espera en el Mapa de estructura (dependiendo de la sintaxis antigua o nueva).
Sin embargo, cuando he estado usando Ninject encuentro un problema al esperar que la instancia sin nombre sea la predeterminada (no cómo funciona Ninject, lo entiendo). Esto llevó a algunas investigaciones que sugirieron que usar instancias con nombre es A Really Bad Idea. Entiendo que hay mejores formas de hacerlo mediante el registro automático o los atributos para establecer un nombre o solicitar un cierto tipo, pero en el sistema que describo debe haber una forma de calcular qué configuración solicitar en el tiempo de ejecución en la parte superior del árbol (y deje que el marco de IoC determine el resto en función de los tipos o reglas registrados).
Entonces ... ¿estoy utilizando el concepto de IoC incorrectamente aquí esperando solicitar mi objeto de nivel superior por nombre o hay generalmente una mejor manera de hacer lo que estoy tratando de hacer? ¿Debería usar algo como MEF y tratar esto como complementos?
Insisto en que no estoy usando esto como una fábrica tonta y preguntando en cada nivel del código por una instancia de tipo x desde el contenedor, es solo la acción iniciadora.
Gracias de antemano por su tiempo y ayuda :)
Gracias Aaron! Eso me ha aclarado algunas cosas :) Es muy apreciado. – NoodleAwa