2012-02-06 12 views
14

È possibile utilizzare ninject per l'iniezione delle dipendenze in modo che il risultato sia simile all'iniezione che posso ottenere in MVC. Per elaborare, se utilizzo l'adattatore MVC ninject, posso dichiarare che i miei web controller hanno parametri di costruzione che sarebbero poi automaticamente iniettati da ninject.Iniezione di iniettore Ninject in WPF

Tuttavia, non ho trovato un'estensione tale Ninject per WPF, che mi avrebbe permesso di avere una finestra come questa:

public partial class MainWindow : Window 
{ 
    private readonly IService injectedService; 
    public MainWindow(IService injectedService) 
    { 
     this.injectedService = injectedService; 
    } 
} 

Vorrei fare questo senza usare esplicitamente il IKernel nel mio avvio dell'applicazione principale per ottenere un'istanza di finestra principale. Preferisco di gran lunga utilizzare il normale metodo di configurazione di xaml per ottenere un'istanza della finestra principale e tutte le finestre successive.

È possibile? C'è un modo per agganciarsi alla creazione di oggetti generata da xaml per modificarlo per usare Ninject per l'iniezione delle dipendenze del costruttore.

+2

Non penso che tale estensione esista, perché in WPF normalmente si utilizza il pattern MVVM e quindi si inietterebbero i servizi nelle classi ViewModel. –

+0

Ma non sono i modelli stessi creati tramite XAML? Devo ammettere che non sono un esperto di WPF, ma i modelli non avrebbero bisogno dello stesso tipo di iniezione di dipendenza? Sono preoccupato per il fatto che il mio contenitore mostri quale ostacolerebbe il testing unitario del progetto. – Dervall

+3

No, i ViewModels non sono creati in XAML. Vengono creati in ViewModelLocator, vedere [here] (http://windowsphonegeek.com/articles/Working-with-a-simple-ViewModelLocator-from-MVVM-Lite) per un esempio. Le tue viste o ViewModels non sanno nulla del tuo contenitore per le dipendenze. –

risposta

17

Sulla base dei commenti & la vostra confusione, sembra MVVM è una buona partita per voi. La sfida è, IMPARARE MVVM.

Quindi apri uno good link e inizia a rotolare. MVVM è sorprendentemente facile da fare, ed è piuttosto semplice avvolgerlo con Ninject e farci un inchino.

La curva di apprendimento iniziale se NON si utilizza una libreria di terze parti per Ninject + MVVM come ho fatto io, è un po 'ripida. Quindi, ecco un paio di cose ho dovuto capire:

 DataContext="{Binding Path=ResultViewModel,Source={StaticResource ServiceLocator}}" 

Questa piccola aggiunta rende consente di attivare Ninject per ottenere le informazioni viewmodel dal XAML:

<Application.Resources> 
    <ioc:NinjectServiceLocator x:Key="ServiceLocator" /> 
</Application.Resources> 

questo piccolo trucco consente di assegnare quella staticresource dal tuo file app.xaml alla classe rilevante

public class NinjectServiceLocator 
{ 
    private readonly IKernel kernel; 

    public NinjectServiceLocator() 
    { 
     kernel = new StandardKernel(new MyMvvmModule()); 
    } 

    public ResultViewModel ResultViewModel 
    { 
     get { return kernel.Get<ResultViewModel>(); } 
    } 
} 

Questo è notevole. Ogni viewmodel deve essere elencato come proprietà nel ServiceLocator in modo che Ninject possa generarli. Infine, MyMvvmModule nell'esempio sopra riportato è la classe standard di Ninject in cui si inserisce l'override per Load() e si collegano tutte le interfacce.

+0

Grazie, molto utile – Dervall

+1

@Dervall Grazie. Questo post è quello che penso che Jeff Atwood abbia immaginato per SO. Ho avuto un problema simile, quindi ho condiviso le informazioni che ho scoperto dopo averle ricercate per ore, salvando chiunque in futuro, un sacco di tempo che spero. – deltree

Problemi correlati