Sto provando a iniettare un IEnumerable
in un costruttore con Ninject.Iniezione di un oggetto IEnumerable in un costruttore con un metodo factory Ninject
mio costruttore si presenta così:
public MatrixViewModel(IEnumerable<FooViewModel> fooViewModels)
{
_fooViewModels = fooViewModels;
}
modulo mio Ninject si presenta così:
public class MainModule : NinjectModule
{
public override void Load()
{
Bind<IEnumerable<FooViewModel>>()
.ToMethod(context => GetFooViewModels())
.InSingletonScope(); // this binding is not working
}
private IEnumerable<FooViewModel> GetFooViewModels()
{
// returns a bunch of foo view models
}
}
Questo non sembra funzionare. Non ho alcun errore. Ninject non usa mai l'associazione e il valore che viene passato al costruttore è fondamentalmente solo un valore predefinito vuoto.
Come si inietta uno IEnumerable
con Ninject?
Modifica
Maggiori dettagli sul mio metodo di fabbrica:
private IEnumerable<FooViewModel> GetFooViewModels()
{
return new[]
{
new FooViewModel
{
Bar = new BarViewModel
{
X = 1,
Y = 2
},
Misc = "Hello"
},
new FooViewModel
{
Bar = new BarViewModel
{
X = 3,
Y = 4
},
Misc = "Goodbye"
},
// etc.....
};
}
Edit 2
Sulla base di risposta di Remo, una possibile soluzione è quella di utilizzare un ciclo foreach di impegnare la visualizza i modelli uno alla volta:
foreach (var fooViewModel in GetFooViewModels())
{
Bind<FooViewModel>().ToConstant(fooViewModel);
}
non sono certo il supporto di raccolta o 'ToMethod' funziona in questo modo. Questo dovrebbe funzionare comunque: 'Bind(). ToMethod (context => new MatrixViewModel (GetFooViewModels()))'. Inoltre, puoi aggiungere la tua risposta alla tua domanda e accettarla se Remo non era abbastanza al livello che avresti voluto accettare come risposta. –
@Merlyn, questo è un buon punto ... semplicemente "salire di livello" e associare l'intero MatrixViewModel (il mio modello di visualizzazione reale ha alcuni parametri, quindi sarebbe un po 'più di lavoro per legare tutto). Per quanto riguarda il motivo per cui non ho messo la mia soluzione in una risposta, potrei chiederti la stessa cosa sul tuo commento :) – devuxer
Vero :) Ci sono sicuramente più soluzioni valide per questo ... –