6

WPF の Ninject で迷っています。

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

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

少しググったところ、そのようには機能しないことがわかりました。解決策を見つけようとして、「void Show();」だけで IMainWindow を作成することになりました。それを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 を取得しています。

私もこれを試しました:

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 の .Inject 行で NullReferenceException を取得しています。

別のさまざまな解決策を見つけましたが、それらは重く見えたので、それらすべてをテストしてどれが機能するかを試すことを断念しました。

何か助けてください。

4

2 に答える 2

6

タイプを正しく登録していないため、2 番目の例では execption がスローされます。正しい構文は次のとおりです。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]そして、プロパティを次の属性でマークする必要があります。

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

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

public interface IMainWindow
{
    void Show();
}
于 2012-11-17T16:22:23.603 に答える
0

解決策が得られたと確信していますが、必要に応じて、MainWindow でプロパティ注入の代わりにコンストラクター注入を使用できます。

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

解決策は次のとおりです。

MainWindow.cs

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

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

}

アプリ.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);
}
于 2013-11-25T15:20:23.070 に答える