使用DI创建同一类的独立实例

时间:2016-10-11 10:18:55

标签: c# wpf mvvm dependency-injection mvvm-light

最初我在ChildUserControlParentUserControlMainWindow使用此视图模型(此处仅为构造函数):

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")));

正如您所看到的,现在我必须在几个地方指出具体的ParentViewModelChildViewModel类,我还必须在任何地方手动使用GetInstance。我认为这是错误的。

我有什么方法可以解决这个问题吗?我想它不能通过 SimpleIoc 解决,但可以 Unity Ninject 帮助吗?

更新(澄清)

我正在寻找向IoC容器说出这个想法的方式:嘿容器,只需在每次需要时创建IMainViewModelIParentViewModel的新实例,但从{{1}开始DI解析(又名IParentViewModel构造函数依赖解析),你应该进入&#34;上下文模式&#34; - 创建随机密钥并使用此创建的密钥执行所有更深层次的解析(也就是使用此密钥使用ParentViewModel)。

0 个答案:

没有答案