私はMVCに精通していますが、Ninjectを使用してWPFを学習しようとしています。誰かが私にいくつかの例や参照を与えることができますか?
OPへのコメントで述べたように、必要なすべての情報は ドキュメントの挿入 内で利用できます。とはいえ、NinjectやDIに慣れていない場合は、膨大なドキュメントの中で迷子になりやすいと主張することができます。
オンラインでいくつかのチュートリアルがあります これ 私は特に有益だと思いました。 console application
を使用した例を示していますが、Ninject
の動作原理は同じです。
アプリケーションの種類に関係なく、アプリケーションのエントリポイントでコンテナを構成します。
Main
App
(フレームワークを使用している場合を除き、その場合はカスタムブートストラップを提供できます)[〜#〜]免責事項[〜#〜]私はNinject
またはDI
の権威であるとは主張していません。以下は、その方法の簡単な例です。私はこれらの2つのオブジェクトを理解していますcan互いに組み合わせて使用することができます。
たとえば、Ninjectのドキュメントに記載されている例を使用してみましょう。
1)NinjectIoC
という名前のWPFアプリケーションを作成します
2)Nugetを使用して、Ninject
プロジェクトへの参照を追加します
3)App.xaml
を開き、StartupUri
要素からApplication
プロパティを削除して、App.xaml
が次のようになるようにします。
<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>
これを行う理由は、StartupUri
プロパティが、アプリケーションの起動時に最初に表示するUIコントロールをWPF
アプリケーションに通知するためです。 Ninject
を使用して、最初のUIコントロールを表示します。
4)App.xaml.cs
を開きます。ここで、Ninject
container
、またはKernel
をNinject
用語を使用するように構成します。アプリケーションのoverride
メソッドをOnStartup
して、container
を構成し、その後、必要に応じてアプリケーションを初期化できるようにします。 App.xaml.cs
の内容を次のように更新します。
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";
}
}
}
簡単な説明:
4.1)OnStartup - Override the
OnStartupmethod so that we may configure our
container`そして、必要に応じてアプリケーションを初期化します。
4.2)ConfigureContainer
-具体的な型をどのように解決するかをcontainer
に通知します。これには、この例で示したよりもはるかに多くのことがありますが、これには私が示したよりもはるかに多くのことがあります。 Multi Binding 、 Binding Conventions 、 Kernel Modules などのトピックがあります。これらについては 公式ドキュメント)から学ぶのが最適です。 。
4.3)ComposeObjects
-App.xaml
からStartupUri
プロパティを削除したので、MainWindow
に使用するUIコントロールをアプリケーションに通知する必要があります。 。 container
にMainWindow
をMainWindow
として使用するように依頼するとともに、Title
プロパティも設定します。ここでも、手動でオブジェクトを作成するために他のタスクを実行することをお勧めします。
上記のように手順を分ける必要はありません。この不自然な例では、気にしないほうが理にかなっています。アプリケーションが成長し、container
を使用してより洗練された作業を開始すると、いくつかの段階を分離することで、container
構成がより管理しやすくなります。選択はあなた次第です。
5)次にMainWindow.xaml
を開き、以下をコピーして貼り付けます。
<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>
何が起こっているのかは明らかであるはずなので、私は上記をわざわざ説明しません。
6)最後にMainWindow.xaml.cs
を開き、次のように更新します。
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);
}
}
上記で起こっていることはNinject
の構成とは何の関係もなく、何が起こっているのかがもう一度明らかになるはずなので、ここでも簡単に説明します。
上記で注目すべき主な点は、argument
コンストラクターが期待するMainWindow
です。 IWeapon
。あなたは自分自身に問いかけているかもしれません私はどこにもWeapon
の具体的な実装を作成していないので、それはどのように解決されますか?
App.xaml.cs
のConfigureContainer
メソッド中に、container
の依存関係をどのように解決するかをIWeapon
に通知しました。
container.Bind<IWeapon>().To<Sword>().InTransientScope();
上記は、container
に、IWeapon
の依存関係が発生した場合は常に、Weapon
のインスタンスを提供することを示しています。 container
resolve(Get
)を要求すると、以下を使用して、最初のMainWindow
コントロールを使用します。
Current.MainWindow = this.container.Get<MainWindow>();
container
はそのコンストラクターを調べ、理解できる引数が最も多いコンストラクターを決定しました。この例では、IWeapon
の実装が必要なのはコンストラクターでしたが、container
は、以前にConfigureContainer
で解決方法を説明したため、この依存関係を解決する方法を知っています。
あなたも私も上記のコードを間違えていないと仮定すると、F5
を押すとアプリケーションが起動し、TextBox
とButton
の小さなウィンドウが表示されます。 TextBox
に何かを入力し、Button
を押すと、MessageBox
に入力した人または何でも、"mad man"
のように剣を振ったことを通知するTextBox
コントロールが表示されます。
Ninject
とDI
の両方には、ここで説明したよりもはるかに多くのものがあります。たとえば、DI
の主題に関する本全体があります。たとえば、 これはMark Seemanによるものです 。
うまくいけば、上記がNinject
とDI
を使用して、どこを見て、どこに進んで冒険を進めるかという基本的な出発点になります。