【发布时间】: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 将是您的组合根。