WPF中的Ninject构造函数注入

Der*_*all 14 c# wpf ninject

是否有可能使用ninject进行依赖注入,结果就像我在MVC中可以得到的注入一样.详细说来,如果我使用MVC ninject适配器,我可以将我的Web控制器声明为具有构造函数参数,然后由ninject自动注入.

但是,我没有为WPF找到这样的ninject扩展,这将使我有一个这样的窗口:

public partial class MainWindow : Window
{
    private readonly IService injectedService;
    public MainWindow(IService injectedService) 
    {
        this.injectedService = injectedService;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在没有明确使用IKernel我的主应用程序启动来获取mainwindow的实例的情况下这样做.我更喜欢使用xaml配置的常规方法来获取主窗口和所有后续窗口的实例.

这可能吗?有没有办法挂钩xaml生成的对象创建来修改它以使用Ninject进行构造函数依赖注入.

del*_*ree 17

根据评论和您的困惑,看起来MVVM非常适合您.挑战是,学习MVVM.

因此,打开一个良好的链接,并开始滚动.MVVM非常容易实现,并且很容易用Ninject包装它并对其进行鞠躬.

如果你不像我那样使用Ninject + MVVM的第三方库,那么初始学习曲线有点陡峭.所以这里有一些我必须要了解的事情:

        DataContext="{Binding Path=ResultViewModel,Source={StaticResource ServiceLocator}}"
Run Code Online (Sandbox Code Playgroud)

这个小小的附加功能允许您触发ninject从XAML获取您的viewmodel信息:

<Application.Resources>
    <ioc:NinjectServiceLocator x:Key="ServiceLocator" />
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

这个小技巧允许您将app.xaml文件中的staticresource分配给相关的类

public class NinjectServiceLocator
{
    private readonly IKernel kernel;

    public NinjectServiceLocator()
    {
        kernel = new StandardKernel(new MyMvvmModule());
    }

    public ResultViewModel ResultViewModel
    {
        get { return kernel.Get<ResultViewModel>(); }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是值得注意的.必须在ServiceLocator中将每个viewmodel列为属性,以便Ninject生成它们.最后,上面示例中的MyMvvmModule是标准的Ninject类,您可以在其中粘贴Load()并覆盖所有接口.