2012-08-02 65 views
1

您好我目前使用WPF的模型/视图模式和国际奥委会,但我有一个问题,我目前有3视图,其中只有两个将需要创建,在运行时确定。WPF MVVM与IUnityContainer创建不需要的多个实例

在每个视图我使用的XAML以提供用于视图中的对象,像这样:

ViewA

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

ViewB

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

现在国际奥委会我创造我的容器和注册所需的模型(modelB或modelC)的一个实例。当试图通过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>()); 

的意见解决是产生更多的模型时,我要的是使用该模型的已建成实例,并注入到浏览此容器。任何人都可以帮助或点我在正确的方向,

感谢,

回答

1

我不是,如果im相当肯定在正确的轨道,但我会看看我是否能帮助反正。

望着查看/ ModelB情景我看你有没有什么方法是:

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

当创建ViewB对象时,它会独立于统一容器创建新的ModelB。 如果您希望您之前在使用的统一容器注册ModelB的情况下,你可以把它当作ViewB的依赖性如

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

如果当您尝试解决一个ViewB有这样的设置,然后您先前注册的ModelB将被传入。

希望有所帮助!

+0

嘿斯科特多数民众赞成在类似于我所做的,我会在下面解释,谢谢。 – somin 2012-08-06 12:07:32

0

只是后来有人发现这一点,并想知道,我解决了这个问题,基本上取消了我的视图中的视图模型的静态引用。

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

而作为斯科特建议注册第一类型,则该类型的一个实例,则解决我inherrited视图并随后基本视图(其中,当在由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(); 
    } 
} 

这一点,就像我说的,解决这个问题,但我希望有会一直使用更清洁的方式继承的观点和他们的模型。其中我仍在寻找,但如果这有助于任何坚持这一点的人,那么很好。