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
Antwort
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 Ninject
container
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.
oh danke, vielen Dank .... Sie hilf mir mehr ... –
@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. [: –
hahaha sorry, done Um Ihre Antwort zu markieren –
Haben Sie sich die Ninject [Dokumentation auf ihrer Website und GitHub] (https://github.com/ninject/ninject/wiki/Getting-Started) angesehen? –
Ich schaue mir schon ihre Seite an. aber immer noch nicht verstehen .. sorry für verschwenden Sie Ihre Zeit –
Das ist in Ordnung, aber eingrenzen Sie Ihre Frage zu etwas spezifischer. Mit was hast du Probleme und was hast du bisher versucht? –