我在项目中使用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);
我不能让[属性注入器]工作。属性注入是否需要与构造函数配对?我已经在使用具有一些参数的构造函数..
答案 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的单个实例并将其返回给所有内容。