1

嗨,我目前正在使用带有模型/视图模式和 IOC 的 WPF,但是我遇到了一个问题,我目前有 3 个视图,其中只需要创建两个,在运行时确定。

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

视图A

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

或者

视图B

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

...ETC

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

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。

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

当我只想创建 1 种类型时,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>());

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

谢谢,

4

2 回答 2

1

我不太确定我是否走在正确的轨道上,但我会看看我是否能提供帮助。

以我看到你所拥有的方式查看 View/ModelB 场景:

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

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

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

如果您有此设置,那么当您尝试解析 ViewB 时,您之前注册的 ModelB 将被传入。

希望有帮助!

于 2012-08-03T02:59:40.860 回答
0

万一以后有人发现了这个问题,并且想知道,我基本上通过在我的视图中取出对视图模型的静态引用来解决这个问题。

<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();
  }
}

就像我说的那样,这解决了这个问题,但我希望有一种更简洁的方式来使用继承的视图及其模型。我仍在寻找其中的内容,但如果这有助于其他坚持这一点的人,那就太好了。

于 2012-08-06T12:30:15.737 回答