web-dev-qa-db-ja.com

WPFアプリケーションでNinjectを使用する方法

私はMVCに精通していますが、Ninjectを使用してWPFを学習しようとしています。誰かが私にいくつかの例や参照を与えることができますか?

16

OPへのコメントで述べたように、必要なすべての情報は ドキュメントの挿入 内で利用できます。とはいえ、NinjectやDIに慣れていない場合は、膨大なドキュメントの中で迷子になりやすいと主張することができます。

オンラインでいくつかのチュートリアルがあります これ 私は特に有益だと思いました。 console applicationを使用した例を示していますが、Ninjectの動作原理は同じです。

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

  • コンソールアプリ-Main
  • WPF -App(フレームワークを使用している場合を除き、その場合はカスタムブートストラップを提供できます)
  • ASP.NET-わからない、おそらく誰かが私を啓発するかもしれない

[〜#〜]免責事項[〜#〜]私は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を開きます。ここで、Ninjectcontainer、またはKernelNinject用語を使用するように構成します。アプリケーションの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 theOnStartupmethod so that we may configure ourcontainer`そして、必要に応じてアプリケーションを初期化します。

4.2)ConfigureContainer-具体的な型をどのように解決するかをcontainerに通知します。これには、この例で示したよりもはるかに多くのことがありますが、これには私が示したよりもはるかに多くのことがあります。 Multi BindingBinding ConventionsKernel Modules などのトピックがあります。これらについては 公式ドキュメント)から学ぶのが最適です。

4.3)ComposeObjects-App.xamlからStartupUriプロパティを削除したので、MainWindowに使用するUIコントロールをアプリケーションに通知する必要があります。 。 containerMainWindowMainWindowとして使用するように依頼するとともに、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.csConfigureContainerメソッド中に、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を押すとアプリケーションが起動し、TextBoxButtonの小さなウィンドウが表示されます。 TextBoxに何かを入力し、Buttonを押すと、MessageBoxに入力した人または何でも、"mad man"のように剣を振ったことを通知するTextBoxコントロールが表示されます。


NinjectDIの両方には、ここで説明したよりもはるかに多くのものがあります。たとえば、DIの主題に関する本全体があります。たとえば、 これはMark Seemanによるものです

うまくいけば、上記がNinjectDIを使用して、どこを見て、どこに進んで冒険を進めるかという基本的な出発点になります。

64
user1548266