最初我在ChildUserControl
内ParentUserControl
内MainWindow
使用此视图模型(此处仅为构造函数):
public MainViewModel(IParentViewModel pvm) {}
public ParentViewModel(IChildViewModel cvm) {}
public ChildViewModel(IMessenger m) {}
ViewModelLocator
中的直接DI初始化:
var container = SimpleIoc.Default;
container.Register<IMessenger, Messenger>();
container.Register<IParentViewModel, ParentViewModel>();
container.Register<IChildViewModel, ChildViewModel>();
container.Register<IMainViewModel, MainViewModel>();
...
public IMainViewModel MainViewModel => ServiceLocator.Current.GetInstance<IMainViewModel>();
然后我需要在第一个实例附近添加第二个ParentUserControl
实例,让它们独立工作。 MainViewModel
构造函数看起来像这样:
public MainViewModel(IParentViewModel pvm1, IParentViewModel pvm2) {}
但DI初始化发生了巨大变化:
container.Register<IMessenger, Messenger>();
container.Register<IParentViewModel>(
() => new ParentViewModel(new ChildViewModel(container.GetInstance<IMessenger>("key1"))),
"key1");
container.Register<IParentViewModel>(
() => new ParentViewModel(new ChildViewModel(container.GetInstance<IMessenger>("key2"))),
"key2");
container.Register<IMainViewModel>(() => new MainViewModel(
container.GetInstance<IParentViewModel>("key1"),
container.GetInstance<IParentViewModel>("key2")));
正如您所看到的,现在我必须在几个地方指出具体的ParentViewModel
和ChildViewModel
类,我还必须在任何地方手动使用GetInstance
。我认为这是错误的。
我有什么方法可以解决这个问题吗?我想它不能通过 SimpleIoc 解决,但可以 Unity 或 Ninject 帮助吗?
更新(澄清)
我正在寻找向IoC容器说出这个想法的方式:嘿容器,只需在每次需要时创建IMainViewModel
和IParentViewModel
的新实例,但从{{1}开始DI解析(又名IParentViewModel
构造函数依赖解析),你应该进入&#34;上下文模式&#34; - 创建随机密钥并使用此创建的密钥执行所有更深层次的解析(也就是使用此密钥使用ParentViewModel
)。