繁体   English   中英

具有IUnityContainer的WPF MVVM创建不需要的多个实例

[英]WPF MVVM with IUnityContainer creating unwanted multiple instances

嗨,我目前将WPF与“模型/视图模式”和IOC一起使用,但是我有一个问题,我目前有3个视图,只需在运行时确定就可以创建两个视图。

在每个视图中,我都使用xaml为视图提供一个对象,如下所示:

视点

<viewmodel:modelA x:Key="viewModel"/>

要么

视图B

<viewmodel:modelB x:Key="viewModel"/>

...等等

这些视图及其后续模型的层次结构如下:

class modelA          { public virtual  ConfigA    {get; set;}   } 
class modelB : modelA { public override ConfigB    {get; set;}   }
class modelC : modelB { public override ConfigC    {get; set;}   }

class ConfigA           { public int Test  { get; set;} } 
class ConfigB : ConfigA { public int TestA { get; set;} } 
class ConfigC : ConfigC { public int TestB { get; set;} } 

现在使用IOC创建容器并注册所需模型(模型B或模型C)的实例。 尝试通过container.resolve实例化所需的视图时,请使用ViewA + ViewB或ViewA + ViewC。

我得到了模型的多个实例。

当我只想创建一种类型时,无论是modelB还是modelC。

switch (Object)
{
  case 1:
    modelB b = new modelB();
    Container.RegisterInstance<modelB>(b, new ContainerControlledLifetimeManager());
    RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<ViewB>());
  break;
  case 1:
    modelC c = new modelC();
    Container.RegisterInstance<modelC>(c, new ContainerControlledLifetimeManager());
    RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<ViewC>());
  break;
}
RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<ViewA>());

当我想要的是容器使用已经构建的模型实例并将其注入到视图中时,视图的解决方案将生成更多模型。 任何人都可以帮助或指出我正确的方向,

谢谢,

我不太确定自己是否走上了正确的道路,但我会看看是否可以提供帮助。

以查看我所拥有的方式查看View / ModelB方案是:

  1. 您可以在UnityContainer中注册ModelB的单个实例
  2. 您尝试解析一个新的ViewB
  3. 将创建一个新的ModelB实例,而不是使用步骤1中的实例

创建ViewB对象时,它将独立于unity容器创建一个新的ModelB。 如果要使用之前在unity容器中注册的ModelB实例,则可以将其作为ViewB的依赖项传入,例如

public class ViewB
{
    public ViewB(ModelB model){ .. }
}

如果您有此设置,则当您尝试解析ViewB时,将传递以前注册的ModelB。

希望有帮助!

以防万一以后有人找到并想知道的情况,我基本上通过删除视图中对viewmodel的静态引用来解决了此问题。

<viewmodel:modelB x:Key="viewModel"/>

正如Scott所建议的,首先注册该类型,然后注册该类型的实例,然后解析我的继承视图,然后解析基本视图(当被DI容器调用时,将注入已注册的类型)。 不幸的是,这意味着在VS2010中,我无法使用设计器在xaml中创建绑定,因为我不得不从视图构造函数中的代码中设置DataContext。

码:

  UserControl view = null;
  switch (runtimeSetArg)
  {
    case 1:
      Container.RegisterType<modelA, modelB>(new ContainerControlledLifetimeManager());
      Container.RegisterInstance<modelB>(new modelB());
      view = Container.Resolve<viewB>();
      break;
    case 2:
      Container.RegisterType<modelA, modelC>(new ContainerControlledLifetimeManager());
      Container.RegisterInstance<modelC>(new modelC());
      view = Container.Resolve<viewC>();
      break;
    case 3:
      ...
      break;
    case default:
      break;
  }

  if (view != null)
  {
    RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<viewA>());        
    RegionManager.Regions[RegionNames.MainRegion].Add(view);
  }

然后在后面的代码中查看

public partial class ViewB: UserControl
{
  public ViewB(IUnityContainer container)
  {
    this.DataContext = (ModelB)container.Resolve<ModelB>();      
    InitializeComponent();
  }
}

就像我说的那样,这解决了问题,但是我希望可以有一种更干净的方法来使用继承的视图及其模型。 我仍在寻找其中的东西,但是如果这能帮助其他坚持这一点的人,那就太好了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM