Si se me permite ofrecer alguna orientación general, en lugar de específica de Ninject sobre esto, le sugiero que reconsidere su diseño ligeramente. El constructor actual es vago porque no ofrece ninguna guía sobre qué implementación de IInterface va a dónde - me doy cuenta de que esto es solo una maqueta de su API real, y mientras que la API real puede ofrecer más ayuda al desarrollador humano en la forma de parámetros con un nombre adecuado, una máquina como un DI Container no puede inferir el uso correcto.
Muchos Contenedores DI ofrecen alguna forma de abordar dicha imprecisión, por ejemplo, proporcionando atributos que puede usar para asociar nombres (metadatos) con cada dependencia. AFAIR, Ninject tiene Inject
atributos ...
Sin embargo, tener en cuenta un par de alternativas:
La primera alternativa es encapsular las dos instancias de interfaz similares en un objeto Parámetro, así:
public interface IParameterObject
{
IInterface ObjectOne { get; }
IInterface ObjectTwo { get; }
}
Ahora puede cambiar el constructor para tomar una instancia de IParameterObject en lugar de las dos instancias de interfaz.
public Something(IParameterObject po)
{
this.concreteObjectOne = po.ObjectOne;
this.concreteObjectTwo = po.ObjectTwo;
}
Esto significa que usted puede empujar la configuración de IParameterObject a la Composition Root.
Otra alternativa a considerar es si tiene sentido considerar el caso con dos casos como un caso especial de un diseño más general que se lleva a cualquier número de instancias. Esto no siempre puede ser el caso, pero si lo es, se puede cambiar el constructor para esto:
public Something(IEnumerable<IInterface> objects)
yo preferiría personalmente ninguna de las sugerencias anteriores sobre cualquier cosa que utiliza características ninject, porque me obliga a hacer que la API sea más explícita en general, y por lo tanto más legible y mantenible.
Prefiero no agregar atributos. El final del artículo muestra cómo hacer uso de las convenciones, p. el parámetro se llama X. Eso es lo que realmente busco. – Finglas
@Finglas He actualizado con otra solución –
Eso es excelente. Estuve cerca cuando estaba jugando para que esto funcione, pero estás en el lugar correcto. No tengo nada en contra de los atributos por cierto, solo encuentro en este escenario que es un desperdicio. Este tipo de configuración no es común en mi base de código, por lo que usar el método When es mucho más agradable. Aclamaciones. – Finglas