Se è possibile fornire alcune indicazioni generali, anziché specifiche di Ninject, suggerirei di riconsiderare leggermente il progetto. Il costruttore corrente è vago perché non offre alcuna guida su quale implementazione di IInterface va dove: mi rendo conto che questo è solo un simulatore della tua vera API e mentre la vera API può offrire più aiuto allo sviluppatore umano in la forma di parametri opportunamente denominati, una macchina come un contenitore DI non può inferire l'uso corretto.
Molti DI Container offrono un modo per risolvere tale vaghezza, ad esempio fornendo attributi che è possibile utilizzare per associare nomi (metadati) a ciascuna dipendenza. AFAIR, Ninject ha Inject
attributi ...
Tuttavia, prendere in considerazione un paio di alternative:
La prima alternativa è quella di incapsulare le due istanze un'interfaccia simile a un oggetto Parametro, in questo modo:
public interface IParameterObject
{
IInterface ObjectOne { get; }
IInterface ObjectTwo { get; }
}
Ora è possibile modificare il costruttore per prendere un'istanza di IParameterObject invece delle due istanze dell'interfaccia.
public Something(IParameterObject po)
{
this.concreteObjectOne = po.ObjectOne;
this.concreteObjectTwo = po.ObjectTwo;
}
Questo significa che è possibile spingere la configurazione del IParameterObject al Composition Root.
Un'altra alternativa a riflettere è se ha senso prendere in considerazione il caso di due istanze come solo un caso speciale di un disegno più generale che prende qualsiasi numero di istanze. Questo non può essere sempre il caso, ma se lo è, è possibile modificare il costruttore per questo:
public Something(IEnumerable<IInterface> objects)
Io personalmente preferirei uno qualsiasi dei suggerimenti di cui sopra su tutto ciò che utilizza specifiche caratteristiche Ninject, perché mi costringe a rendere l'API più esplicita in generale, e quindi più leggibile e mantenibile.
Preferisco non aggiungere attributi. La fine dell'articolo mostra come utilizzare la convenzione, ad es. il parametro si chiama X. Questo è quello che cerco davvero. – Finglas
@Finglas Ho aggiornato con un'altra soluzione –
È eccellente. Ero vicino quando stavo giocando per farlo funzionare, ma tu sei perfetto. A proposito, non ho nulla contro gli attributi, ma trovo che in questo scenario sia uno spreco. Questo tipo di configurazione non è comune nella mia base di codice, quindi usare il metodo When è molto più bello. Saluti. – Finglas