2012-11-17 22 views
6

WPFのNinjectで迷子になりました。NinjectのWPFアプリ

私はApp.xamlで初期化しますが、(InjectAttributeを使用していても)MainWindow.xamlのITestプロパティは解決されず、nullのままです。

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    {  
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<ITest, Test>(); 
     base.OnStartup(e); 
    } 
} 

私はちょっとグーグルでそれがうまくいかないことを知りました。解決策を見つけようとすると、私はIMainWindowを "Show(void)"を除いて作成することになりました。それをMainWindowに追加します。このため

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    {  
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<ITest, Test>(); 

     kernel.Bind<IMainWindow, MySolution.MainWindow>(); 
     kernel.Get<IMainWindow>().Show(); 

     base.OnStartup(e); 
    } 
} 

、私はに.get

でライン上とNullReferenceExceptionを取得しています、私もこれを試してみました:今、私は.InjectラインでとNullReferenceExceptionを取得しています

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    {  
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<ITest, Test>(); 

     MainWindow = new MySolution.MainWindow(kernel); 
     //then kernel.Inject(this); in the MainWindow constructor 
     MainWindow.Show(); 

     base.OnStartup(e); 
    } 
} 

MainWindowにあります。

私は別のさまざまなソリューションを見つけましたが、ヘビーウェイトのように見えましたが、私はそれらのすべてをテストし、どちらが動作するのかを諦めました。

お願いします。

+0

'NullReferenceException'はあなたを正確に何をしているのですか? – AgentFire

答えて

5

タイプを正しく登録していないため、2番目の例では実行がスローされます。 、私はあなたが解決策を持って確信している

public partial class MainWindow : Window, IMainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    [Inject] 
    public ITest Test { get; set; } 
} 

public interface IMainWindow 
{ 
    void Show(); 
} 
+0

私はバインド()はバインド()と同じだと思った。()。明らかにそうではありません。ありがとう! – Mirek

+0

'Bind ()'では、1つの実装に2つのインタフェースをバインドできますが、実装に '.To <>'を指定する必要があります。 – nemesv

+0

私はこれが古かったことを知っていますが、私がこれを行うと、私は1つではなく2つのメインウィンドウを表示します。何かご意見は? – JMK

0

:だから正しい使用kernel.Bind<SomeInterface>().To<SomeImplementation>()

:正しい構文は次のとおりです

protected override void OnStartup(StartupEventArgs e) 
{ 
    IKernel kernel = new StandardKernel(); 
    kernel.Bind<ITest>().To<Test>(); 

    kernel.Bind<IMainWindow>().To<MainWindow>(); 
    var mainWindow = kernel.Get<IMainWindow>(); 
    mainWindow.Show(); 

    base.OnStartup(e); 
} 

そして、あなたは[Inject]属性であなたの財産をマークする必要があります必要に応じてMainWindowでプロパティインジェクションの代わりにコンストラクタインジェクションを使用することができます。

これにより、ダミーインターフェイスIMainWindowを作成したり、注入したすべてのクラスに対して不要なパブリックプロパティを作成したりすることがなくなります。ここで

のソリューションです:

MainWindow.cs

public partial class MainWindow : Window, IMainWindow 
{ 
    private readonly ITest test; 

    public MainWindow(ITest test) 
    { 
     this.test = test; 
     InitializeComponent(); 
    } 

} 

App.xaml.cs:

protected override void OnStartup(StartupEventArgs e) 
{ 
    IKernel kernel = new StandardKernel(); 
    kernel.Bind<ITest>().To<Test>(); 

    var mainWindow = kernel.Get<MainWindow>(); 
    mainWindow.Show(); 

    base.OnStartup(e); 
}