【问题标题】:Dependency Injection using ninject not working使用ninject的依赖注入不起作用
【发布时间】:2018-07-05 02:09:42
【问题描述】:

我的目标很简单:我希望将已经存在的“MainWindowVM”类实例(实现 IMainWindowVM)注入到“StaticTestsResultsViewModel”类中。我不(!)希望实例化类“MainWindowVM”的新实例。相反,我希望将此类的已经存在的实例注入到类“StaticTestsResultsViewModel”中。

【问题讨论】:

  • 您还没有真正提供足够的信息来了解这里发生了什么,但我不禁注意到您有许多名称中包含静态的类,但实际上没有什么是静态的。跨度>
  • 应用程序正在对软件进行静态分析......这就是为什么一切都被称为 StaticAnalysisblabla
  • 好的,你需要看看你的创建结构,但你可以看看在ninject中注册单例对象,这在诸如此类的帖子中有所介绍:stackoverflow.com/questions/21706436/…
  • 我理解这篇文章的方式是我应该执行以下操作: kernel.Bind.To().InSingletonScope();但是,正如视觉工作室告诉我的那样,这“在这种情况下是不允许的”
  • 有一个使用 Ninject 和 WPF here 的例子。请务必点击底部的链接到相关答案,因为该链接似乎提供了对从使用服务定位器切换到使用 DI 的公认答案的改进。

标签: c# wpf visual-studio dependency-injection ninject


【解决方案1】:

我的目标很简单:我希望将已经存在的“MainWindowVM”类实例(实现 IMainWindowVM)注入到“StaticTestsResultsViewModel”类中。我不(!)希望实例化类“MainWindowVM”的新实例。相反,我希望将此类的已经存在的实例注入到类“StaticTestsResultsViewModel”中。

在这种情况下,您应该像这样注册它:

kernel.Bind<IMainWindowVM>().To<MainWindowVM>().InSingletonScope();

请记住,当您将一个类注册为单例时,这会隐式地使其所有依赖项也成为单例。见Captive Dependency。如果这对您的应用程序设计来说是不可接受的,您应该将存储共享属性的单例实例移动为 MainWindowVM 的依赖项,并且 not 使 MainWindowVM 单例(例如瞬态)。

                          PropertyHolder (Singleton)
                         /
MainWindowVM (Transient)
                        \
                          OtherDependency (Any scope shorter than singleton)

【讨论】:

  • kernel.Bind().To().InSingletonScope();正是我所做的(请参阅我编辑的帖子中文件 IocConfiguration.cs 中的代码)......但它没有工作
  • 您的设置不包括我之前提到的this answer 的修改。
  • 这意味着从 App.xaml 中删除 StartUpUri 属性(Application 元素的最后一个属性及其值)。
  • 1) YourModule() 是一个 Ninject 模块,它是一种将多个相关的 kernel.Bind 语句移动到一个块中的方法。如果您在模块中执行此操作,或者用您的所有 Bind 语句替换该行,则没有区别。 2) 是的,就该示例而言。
  • 3) 我找到了我之前给here 的答案,字面意思是“书本上”。它更复杂,但至少它是一体的。我怀疑你会遇到StaticTestsResultsViewModelLocator 的问题,这提供了一种解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多