2013-12-16 10 views
14

Ich bin vertraut mit MVC, aber ich versuche, WPF mit Ninject zu lernen. Kann mir jemand ein Beispiel oder eine Referenz geben?Wie Ninject in WPF-Anwendung zu verwenden

+1

Haben Sie sich die Ninject [Dokumentation auf ihrer Website und GitHub] (https://github.com/ninject/ninject/wiki/Getting-Started) angesehen? –

+0

Ich schaue mir schon ihre Seite an. aber immer noch nicht verstehen .. sorry für verschwenden Sie Ihre Zeit –

+0

Das ist in Ordnung, aber eingrenzen Sie Ihre Frage zu etwas spezifischer. Mit was hast du Probleme und was hast du bisher versucht? –

Antwort

53

Wie ich in meinem Kommentar zu Ihrem OP gesagt habe, sind alle benötigten Informationen innerhalb der Ninject documentation verfügbar. Das heißt, es könnte argumentiert werden, dass es leicht ist, sich in seiner umfangreichen Dokumentation zu verlieren, wenn Sie mit Ninject und/oder DI nicht vertraut sind.

Es gibt ein paar Tutorials online, von denen ich dachte, this one war besonders informativ. Während es ein Beispiel unter Verwendung eines console application liefert, bleiben die Prinzipien, wie Ninject funktioniert, gleich.

Unabhängig von Ihrem Anwendungstyp konfigurieren Sie Ihren Container am Eingangspunkt Ihrer Anwendung.

  • Console app - Main
  • WPF - App (es sei denn, Sie einen Rahmen verwenden, in dem Fall, dass Sie eine benutzerdefinierte Bootstrap bereitstellt)
  • ASP.NET - Keine Ahnung, könnte vielleicht jemand aufklären mich

HAFTUNGSAUSSCHLUSS ich behaupte nicht, eine Autorität auf Ninject oder DI zu sein, unten ist einfach ein schnelles Beispiel, wie ich diese beiden Objekte verstehen kann kann in Verbindung miteinander verwendet werden.

Zum Beispiel, lassen Sie uns mit den Beispielen in der Ninject-Dokumentation arbeiten.

1) erstellen WPF-Anwendung namens NinjectIoC

2) Verwenden Nuget einen Verweis auf das Ninject Projekt

3) öffnen App.xaml und entfernen Sie die StartupUri Eigenschaft aus dem Application hinzufügen Element, so dass Ihr App.xaml wie folgt aussieht:

<Application x:Class="NinjectIoC.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Application.Resources> 

    </Application.Resources> 
</Application> 

Der Grund, warum wir dies tun, ist, weil die StartupUri Eigenschaft die WPF Anwendung informiert, welche UI-Steuerung anfänglich angezeigt wird, wenn die Anwendung gestartet wird. Wir werden Ninject verwenden, um unsere anfängliche UI-Kontrolle anzuzeigen.

4) Geöffnet App.xaml.cs. Dies ist, wo wir die Ninjectcontainer oder konfigurieren werden, Ninject Terminologie zu verwenden. Wir override die Anwendung OnStartup Methode, so dass wir unsere container konfigurieren und anschließend die Anwendung initialisieren können, wie wir möchten.Aktualisieren Sie den Inhalt Ihrer App.xaml.cs wie folgt aussehen:

namespace NinjectIoC 
{ 
    using Ninject; 
    using System.Windows; 

    public partial class App 
    { 
     private IKernel container; 

     protected override void OnStartup(StartupEventArgs e) 
     { 
      base.OnStartup(e); 
      ConfigureContainer(); 
      ComposeObjects(); 
      Current.MainWindow.Show(); 
     } 

     private void ConfigureContainer() 
     { 
      this.container = new StandardKernel(); 
      container.Bind<IWeapon>().To<Sword>().InTransientScope(); 
     } 

     private void ComposeObjects() 
     { 
      Current.MainWindow = this.container.Get<MainWindow>(); 
      Current.MainWindow.Title = "DI with Ninject"; 
     } 
    } 
} 

Eine kurze explination:

4,1)OnStartup - Override the OnStartup method so that we may configure our container` und initialisieren die Anwendung, wie wir es wünschen.

4,2) - Informieren Sie unsere container, wie wir unsere konkreten Typen lösen möchten. Es gibt viel mehr, als ich in diesem Beispiel gezeigt habe, aber es gibt weit mehr als ich gezeigt habe. Es gibt Themen wie Multi Binding, Binding Conventions und Kernel Modules, für die Sie am besten aus der official documentation darüber lernen.

4,3)ComposeObjects - Nachdem die StartupUri Eigenschaft von App.xaml entfernt wir die Anwendungssteuerung, die UI informieren müssen wir es für die MainWindow verwenden möchten. Neben der Frage container, MainWindow als MainWindow zu verwenden, setzen wir auch die Title Eigenschaft. Auch hier möchten Sie möglicherweise andere Aufgaben für die manuelle Objektkomposition ausführen.

Sie müssen die Schritte nicht wie oben beschrieben trennen, für dieses konstruierte Beispiel wäre es sinnvoller, sich nicht zu kümmern. Wenn Ihre Anwendung wächst und Sie beginnen, anspruchsvollere Dinge mit der container zu tun, beginnt die Trennung der einzelnen Stufen die container Konfiguration leichter zu gestalten. Es ist deine Entscheidung.

5) Weiter offen MainWindow.xaml, dann kopieren und fügen Sie den folgenden:

<Window x:Class="NinjectIoC.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="78" Width="362"> 
    <Grid> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="269,10,0,0" VerticalAlignment="Top" Width="75" Click="Attack"/> 
     <TextBox x:Name="Target" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" VerticalAlignment="Top" Width="254"/> 
    </Grid> 
</Window> 

Ich werde nicht die Mühe, die oben erklärt, wie es sollte klar sein, was los ist.

6) Schließlich offen MainWindow.xaml.cs und es wie folgt aktualisieren:

namespace NinjectIoC 
{ 
    using System.Windows; 

    public partial class MainWindow 
    { 
     private readonly IWeapon weapon; 

     public MainWindow(IWeapon weapon) 
     { 
      this.weapon = weapon; 
      InitializeComponent(); 
     } 

     private void Attack(object sender, RoutedEventArgs e) 
     { 
      this.weapon.Hit(this.Target.Text); 
     } 
    } 

    public class Sword : IWeapon 
    { 
     public void Hit(string target) 
     { 
      MessageBox.Show(@"I swing and thrust my sword about like a mad man at " + target); 
     } 
    } 

    public interface IWeapon 
    { 
     void Hit(string target); 
    } 
} 

Wieder werde ich es kurz machen wie das, was oben geschieht nichts mit der Konfiguration von Ninject zu tun und es sollte wieder einmal sein offensichtlich, was passiert.

Die wichtigste Sache zu beachten, in der oben genannten ist die argument, die der MainWindow Konstruktor erwartet; IWeapon. Sie fragen sich vielleicht Wie wird das gelöst, da ich keine konkrete Implementierung von Weapon irgendwo erstellen?

Gut während der Methode in App.xaml.cs informierten wir die container, wie wir es für IWeapon Abhängigkeiten lösen möchten:

container.Bind<IWeapon>().To<Sword>().InTransientScope(); 

Die oben erzählt die container, die überall es eine Abhängigkeit für IWeapon begegnet möchten wir es eine Instanz von Weapon bereitzustellen.Fordert die container resolve (Get) unsere anfängliche MainWindow Kontrolle, unter Verwendung der folgenden:

Current.MainWindow = this.container.Get<MainWindow>(); 

Die container warf einen Blick auf seine Erbauer und bestimmt den Konstruktor mit den meisten Argumente, die es verstanden. In diesem Beispiel war es der Konstruktor, der eine Implementierung von IWeapon benötigte, und oh, die container weiß, wie man diese Abhängigkeit auflöst, weil wir ihr vorher in mitgeteilt haben.

Vorausgesetzt, weder Sie noch ich haben irgendwelche Fehler mit dem obigen Code gemacht, drücken Sie F5 sollte die Anwendung starten, und Sie sollten ein kleines Fenster mit einer TextBox und Button sehen. Geben Sie etwas in die TextBox dann drücken Sie die Button und Sie sollten eine MessageBox Kontrolle sehen, die Sie informiert, dass Sie Ihr Schwert wie ein "mad man" bei wem oder was auch immer Sie in der TextBox eingegeben haben schwang.


Es gibt weit mehr sowohl auf Ninject und DI als ich hier beschrieben habe. Zum Beispiel gibt es ganze Bücher zum Thema DI wie this one by Mark Seeman.

Hoffentlich wird die oben erhalten Sie bei grundlegenden Ausgangspunkt geben, wo sie suchen und wo weiter mit Ninject und DI mit Ihrem Abenteuer gehen, um die Fortschritte.

+0

oh danke, vielen Dank .... Sie hilf mir mehr ... –

+0

@noviankristianto - Ich bin froh, dass ich Ihnen behilflich sein kann.Wenn Sie meine Antwort nützlich fanden, denken Sie bitte entweder an eine Erwähnung oder an die Antwort sowohl für mich selbst als auch für die Gemeinschaft. [: –

+0

hahaha sorry, done Um Ihre Antwort zu markieren –