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);
我无法使[属性注入器]工作。属性注入是否需要与构造函数配对?我已经在使用一个有一些参数的构造函数。。
您的示例中出现了问题。如果要将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实例,并为所有内容返回它。