【问题标题】:Unity Dependency Injection (constructor or property)Unity 依赖注入(构造函数或属性)
【发布时间】:2012-01-22 21:24:16
【问题描述】:

我在项目中使用 Unity 已经有一段时间了。我有一个单例容器,我用它来注册类型和/或实例,然后再解析。

今天我想通过使用属性或构造函数注入来自动化一些实例化。

我从 Logger 类开始。在应用程序开始我有这个代码:

RegisterType<Logger, Logger>();

比在我的 ViewModel 中

[Dependency]
    public Logger MyLogger {
        get;
        set;
    }

这是我如何实例化具有此属性的视图模型(在 MainWindow.xaml.cs 中)

private void InitializeViewModel() {
    _vm = new MainViewModel(MainGrid);
    ...
    MyContainer.GetInstance().Container.RegisterInstance<MainViewModel>(_vm);

我无法让那个 [属性注入器] 工作。属性注入是否需要与构造函数配对?我已经在使用一个有一些参数的构造函数了..

【问题讨论】:

  • 如何创建包含 Logger 属性的对象?
  • 这就是我的怀疑,请参阅@WiktorZychia 的答案 :)

标签: c# dependency-injection unity-container


【解决方案1】:

你的例子有问题。如果您希望将Logger 注入MainViewModel,则必须让容器为您创建MainViewModel

但是,在您的代码中,您是自己创建的。在我看来,它应该是:

_vm = Container.Resolve<MainViewModel>();

至少

_vm = new MainViewModel();
Container.BuildUp( _vm ); 

【讨论】:

  • 谢谢。就是这样。问题,如果我调用 Container.Resolve().. 这是否意味着它每次都会创建一个 MainViewModel 的新实例,还是只会实例化一次,并在所有后续调用 Resolve 时返回该实例?跨度>
  • RegisterInstance 有效地为您的对象实现单例行为。对于所有后续对Resolve 的调用,它将返回相同的MainViewModel 实例。 msdn.microsoft.com/en-us/library/ff660872(v=pandp.20).aspx
  • 安德烈亚斯,谢谢,RegisterIntance 是不言自明的......我问的是不使用 RegisterInstance 时的解决行为
  • 好吧,刚刚想通了。简单地调用 Resolve 总是会创建一个新实例。
  • @SonicSoul,这是Resolve 的默认行为。您可以通过将LifetimeManager 作为参数传递给RegisterType&lt;&gt;() 来覆盖该行为。有关详细信息,请参阅我的完整答案。
【解决方案2】:

您需要让 Unity Container 来创建视图模型,而不是使用 new MainViewModel()

Container.RegisterType<MainViewModel>(
     new ContainerControlledLifetimeManager(),
     new InjectConstructor(MainGrid)
   );

然后您可以使用Container.Resolve&lt;MainViewModel&gt;() 来获取您的单身人士以前称为_vm

注意:ContainerControlledLifetimeManager 部分告诉 Unity 只创建一个 MainViewModel 实例并将其返回给所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2011-02-02
    • 2010-12-02
    • 1970-01-01
    相关资源
    最近更新 更多