【问题标题】:Ninject constructor injection in WPFWPF中的Ninject构造函数注入
【发布时间】:2012-02-27 22:45:03
【问题描述】:

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

但是,我还没有找到这样的 WPF ninject 扩展,它可以让我拥有这样的窗口:

public partial class MainWindow : Window
{
    private readonly IService injectedService;
    public MainWindow(IService injectedService) 
    {
        this.injectedService = injectedService;
    }
}

我想在我的主应用程序启动时不显式使用IKernel 来获取主窗口实例。我更喜欢使用 xaml 配置的常规方法来获取主窗口和所有后续窗口的实例。

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

【问题讨论】:

  • 我认为不存在这样的扩展,因为在 WPF 中您通常会使用 MVVM 模式,因此会将服务注入到您的 ViewModel 类中。
  • 但是模型本身不也是通过 XAML 创建的吗?诚然,我不是 WPF 方面的专家,但模型不需要相同类型的依赖注入吗?我担心让我的容器显示会阻碍项目的单元测试。
  • 不,ViewModel 不是在 XAML 中创建的。它们是在 ViewModelLocator 中创建的,例如,请参阅 here。您的视图或视图模型对您的依赖注入容器一无所知。
  • 但是 ViewModelLocator 会知道它。我想这很好,但对我来说仍然感觉像是服务定位器(反)模式,并且在注入内核周围有一层额外的包裹,可以自动处理。
  • 两者都不是,因为 ViewModelLocator 将是您的组合根。

标签: c# wpf ninject


【解决方案1】:

根据 cmets 和您的困惑,看起来 MVVM 非常适合您。挑战在于,学习 MVVM。

所以打开good link 并开始滚动。 MVVM 做起来出奇的容易,而且用 Ninject 把它包起来很容易。

如果您不像我那样为 Ninject + MVVM 使用 3rd 方库,那么最初的学习曲线会有点陡峭。所以这里有几件事我必须理解:

        DataContext="{Binding Path=ResultViewModel,Source={StaticResource ServiceLocator}}"

这个小小的添加允许您触发 ninject 从您的 XAML 中获取您的视图模型信息:

<Application.Resources>
    <ioc:NinjectServiceLocator x:Key="ServiceLocator" />
</Application.Resources>

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

public class NinjectServiceLocator
{
    private readonly IKernel kernel;

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

    public ResultViewModel ResultViewModel
    {
        get { return kernel.Get<ResultViewModel>(); }
    }
}

这是值得注意的。每个视图模型都必须在 ServiceLocator 中作为属性列出,以便 Ninject 生成它们。最后,上面示例中的 MyMvvmModule 是标准的 Ninject 类,您可以在其中粘贴对 Load() 的覆盖并绑定所有接口。

【讨论】:

  • @Dervall 谢谢。这篇文章是我认为 Jeff Atwood 为 SO 所设想的。我有一个类似的问题,所以我分享了我在研究了几个小时后发现的信息,希望在未来为任何人节省很多时间。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2018-03-27
  • 2011-08-29
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多