6

我在WPF中迷失了Ninject。

我正在 App.xaml 中对其进行初始化,但 MainWindow.xaml 中的 ITest 属性(即使使用 InjectAttribute)没有得到解决并且保持为空。

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

我用谷歌搜索了一下,发现它不是那样工作的。在试图找到解决方案时,我最终创建了 IMainWindow,除了“void Show();”之外什么都没有。并将其添加到主窗口。

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

为此,我得到一个 NullReferenceException 与 .Get

我也试过这个:

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

您没有正确注册您的类型,这就是第二个示例引发异常的原因。正确的语法是: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 并为所有注入的类创建不必要的公共属性。

这是解决方案:

主窗口.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 回答