Unity依赖注入(构造函数或属性)

本文关键字:属性 构造函数 依赖 注入 Unity | 更新日期: 2023-09-27 18:21:09

我在项目中使用Unity已经有一段时间了。我有一个singleton Container,用于注册类型和/或实例,然后进行解析。

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

我从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);

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

Unity依赖注入(构造函数或属性)

您的示例中出现了问题。如果要将Logger注入MainViewModel,则必须让容器为您创建MainViewModel

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

_vm = Container.Resolve<MainViewModel>();

或至少

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

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

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

然后您可以使用Container.Resolve<MainViewModel>()来获得以前称为_vm的单例。

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