2013-12-16 9 views
14

私はMVCに精通していますが、WPFをNinjectで学習しようとしています。ある人が私にいくつかの例や参照を与えることができますか?NinjectをWPFアプリケーションで使用する方法

+1

Ninject [自分のサイトのドキュメントとGitHub](https://github.com/ninject/ninject/wiki/Getting-Started)を見ましたか? –

+0

私はすでに自分のサイトを見ています。しかし、まだ理解していません。あなたの時間を無駄にしてごめんね。 –

+0

それは問題ありません。あなたは何の問題を抱えていますか、これまで何を試していますか? –

答えて

53

あなたのOPに私のコメントで言ったように、あなたが必要とするすべての情報はNinject documentationの中にあります。それは、あなたがNinjectやDIに慣れていないと膨大な文書の中に失われやすいと主張することができます。

this one私は特に有益だと思ったオンラインのチュートリアルがいくつかあります。 console applicationを使用した例を提供していますが、どのように動作するのかは同じです。

アプリケーションタイプに関係なく、アプリケーションのエントリポイントでコンテナを設定します。

  • コンソールアプリ - Main
  • WPF - App(あなたは独自のブートストラップを提供することができる場合には、フレームワークを使用していない限り)
  • ASP.NET - ノーアイデア、おそらく誰かが私に
  • を啓発することができ私は NinjectDIの権威であることを主張していない

免責事項、以下は、これらの2つのオブジェクトを理解するための簡単な例です。を互いに組み合わせて使用​​することができます。

たとえば、Ninjectのドキュメントで提供されている例を使用して作業してください。

1)Ninjectプロジェクト

3)オープンApp.xamlへの参照を追加するNinjectIoC

2)使用Nugetという名前のWPFアプリケーションを作成し、ApplicationからStartupUriプロパティを削除要素を入力すると、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アプリケーションに通知するためです。最初のUIコントロールを表示するには、Ninjectを使用します。

4)オープンApp.xaml.cs。ここで、Ninjectcontainer、またはKernelNinjectという用語を使用するように設定します。アプリケーションOnStartupoverrideメソッドに設定して、containerを設定してから、必要に応じてアプリケーションを初期化します。

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"; 
     } 
    } 
} 

簡単explination:次のように見て、あなたのApp.xaml.csの内容を更新し

4.1)OnStartup - Override the OnStartup method so that we may configure our container`、我々が望むように、アプリケーションを初期化します。

4.2) - 私たちは私たちの具体的な種類を解決したいと思いますどのように私たちのcontainerを通知します。私がこの例で表示したよりもはるかに多いですが、私が示した以上にこれ以上のことがあります。 Multi BindingBinding ConventionsKernel Modulesなどのトピックがありますが、official documentationから学ぶのが最も良いです。

4.3)ComposeObjectsは - 私たちはそれがMainWindowのために使用したいUIコントロールをアプリケーションに通知しなければならないApp.xamlからStartupUriプロパティを削除しました。私たちのcontainerMainWindowを私たちの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開いて、次のように更新します。どのような上記の起こっていることNinjectのコンフィギュレーションとは何の関係もないよう

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); 
    } 
} 

が再び私はこの短いを行いますし、それが再びする必要があります明らかに何が起こっている。

上記の注意点は、MainWindowコンストラクタが予期しているargumentです。 IWeapon。あなたは自分自身に尋ねているかもしれませんWeaponの具体的な実装をどこにも作成していないので、どのように解決されますか?我々はそれがIWeaponの依存関係を解決したいと思いますかcontainerを知らせApp.xaml.csで方法中まあ

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

上記のどこにでも、それは私たちが希望IWeaponの依存関係に遭遇することcontainerを伝えますそれはWeaponのインスタンスを提供する。使用して、container決意(Get)当初MainWindow制御を要求されると、次の

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

containerは、そのコンストラクタを見ていたし、それが理解ほとんどの引数を持つコンストラクタを決定しました。この例では、IWeaponの実装が必要なコンストラクタでしたが、containerはこの依存関係を解決する方法を知っています。なぜなら、それを以前の方法で行っていたからです。

あなたも私も上記のコードで間違いがないと仮定すると、F5を押すとアプリケーションが起動し、TextBoxButtonの小さなウィンドウが表示されます。 TextBoxに何かを入力してButtonを押すと、TextBoxに入力した人の誰でも何でも"mad man"のように剣を振ったことを知らせるMessageBoxコントロールが表示されます。


私はここで説明しているよりもNinjectDIの両方にはるかに多くがあります。たとえば、DIの件名に関する書籍全体がthis one by Mark Seemanなどです。

願わくば上記のように、あなたの冒険をさらに進展させるための基礎的な出発点として、NinjectDIをお勧めします。

+0

ああおかげであなたは、そんなにありがとう....あなたはより多くの私を助けて... –

+0

@noviankristianto - 私は助けになることをうれしく思いますあなたは私の答えが有用であることが判明した場合、両方の自分自身と社会のためにupvoteかの答えとしてそれをマークするのいずれかを考えてみてください[: –

+0

申し訳ありませんハハハ、行わ。あなたの答え –

関連する問題