Domanda

Ho un UserControl WPF che mi piacerebbe per iniettare le dipendenze in. Qual è il modo migliore per fare questo con Ninject ?

Per fare un esempio concreto: ho un UserControl chiamato MapView, e voglio iniettare un'istanza della mia IDialogueService in esso, sia tramite il costruttore o l'iniezione di proprietà. Al momento, non sto utilizzando qualsiasi iniezione di dipendenza, e il mio controllo viene creato in XAML:

<Window x:Class="GameWindow" ...>
    <Grid Name="root">
        <MapView x:Name="mapView" ... />
        <!-- other stuff here -->
    </Grid>
</Window>

La creazione di un Ikernel, e vincolante l'IDialogueService, è abbastanza semplice. Ma io sono bloccato su come utilizzare il kernel per iniettare le dipendenze nel mio MapView. Sono ancora un newbie totale a Ninject, quindi forse c'è qualcosa ovvio che mi manca.

mi viene in mente diversi modi per risolvere questo:

  1. un'istanza della MapView nel codice. Rimuovere il <MapView ... /> dal XAML, e invece aggiungere questo al costruttore di GameWindow:

    public GameWindow(IKernel kernel) {
        root.Children.Add(kernel.Get<MapView>());
    }
    

    Svantaggi: complessità in più da non usare XAML; GameWindow ha una dipendenza Ikernel.

  2. Conservare l'istanza in XAML, e utilizzare l'iniezione proprietà invece:

    public GameWindow(IKernel kernel) {
        kernel.Inject(mapView);
    }
    

    Downside: Documenti Ninject dicono che Inject () "non deve essere utilizzato per la maggior parte dei casi", quindi non so nemmeno se lo fa quello che penso che fa, o se ha senso usarlo qui. E GameWindow ha ancora una dipendenza da Ikernel.

  3. Aggiungi iniettabili parametri / oggetti da GameWindow che passano i valori lungo il MapView (probabilmente tramite immobili in MapView), e quindi utilizzare Get<GameWindow>(). Downside:. Ora sto passando manualmente le dipendenze in tutto il luogo, che è ciò che si suppone un quadro DI automatizzare per me

  4. Dopo istanziare la GameWindow, a piedi l'albero logico e chiamare IKernel.Inject () su tutto. Lati negativi: ancora una volta, io non so se Inject () fa quello che penso che fa, o se è appropriato qui. Chiamante deve ricordarsi di fare la passeggiata-il-video-tree-e-iniettare cosa dopo un'istanza di un GameWindow.

C'è un modo migliore per fare questo? Forse un estensione WPF per Ninject che mi permette di fare un Get<GameWindow>(), e automaticamente passeggiate l'albero logico per me (come in 4 #), fare l'iniezione di proprietà su tutto? Se una cosa del genere non esiste, sarebbe possibile per me scrivere è?

Come si fa a ragazzi approccio usando Ninject con WPF? Non si utilizza qualsiasi degli approcci di cui sopra (e se è così, si può condividere fino / aspetti negativi che non conosco circa)? Hai migliori approcci?

È stato utile?

Soluzione

1) è il migliore. Troverete anche che è un comodo punto di ingresso per le funzioni MapView.

Inoltre, invece di passare nel kernel, basta fare kernel.Get () e [iniettare] MapView in GameWindow.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top