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

时间:2012-01-22 21:24:17

标签: c# dependency-injection unity-container

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

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

我开始使用Logger类。在Application start中我有这个代码:

RegisterType<Logger, Logger>();

比我的ViewModel

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

_vm = Container.Resolve<MainViewModel>();

或至少

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

答案 1 :(得分:1)

您需要让Unity容器进行创建,而不是使用new MainViewModel()来创建视图模型。

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

然后您可以使用Container.Resolve<MainViewModel>()将您的单身人士称为_vm

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