gpt4 book ai didi

c# - 带有 Ninject 的 WPF 应用程序

转载 作者:太空狗 更新时间:2023-10-29 21:34:54 24 4
gpt4 key购买 nike

我迷失了 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);
}
}

为此,我在 .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);
}
}

现在我在主窗口的 .Inject 行收到 NullReferenceException。

我找到了其他各种解决方案,但它们似乎很重量级,我放弃了测试所有这些解决方案并尝试哪个有效。

有什么帮助吗?

最佳答案

您没有正确注册您的类型,这就是第二个示例抛出异常的原因。正确的语法是: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] 标记您的属性(property)属性:

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

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

public interface IMainWindow
{
void Show();
}

关于c# - 带有 Ninject 的 WPF 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13432134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com