您好我正在使用WPF与模型/视图模式和IOC,但是我遇到了问题我目前有3个视图,其中只需要创建两个视图,在运行时确定。
在每个视图中,我使用xaml为视图提供对象,如下所示:
ViewA
<viewmodel:modelA x:Key="viewModel"/>
或
ViewB
<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,我正在创建我的容器并注册所需模型的实例(modelB或modelC)。尝试实例化所需的视图时,通过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>());
当我想要的是容器使用已经构造的模型实例并将其注入视图时,解析视图会生成更多模型。任何人都可以帮助或指出我正确的方向,
谢谢,
答案 0 :(得分:1)
我不太确定我是否在正确的轨道上,但我会看看我是否能提供帮助。
查看View / ModelB场景,我看到你拥有的是:
创建ViewB对象时,它会独立于unity容器创建一个新的ModelB。 如果您想要使用先前在Unity容器中注册的ModelB实例,则可以将其作为ViewB的依赖项传递,例如
public class ViewB
{
public ViewB(ModelB model){ .. }
}
如果您有此设置,那么当您尝试解析ViewB时,您的以前注册的ModelB将被传入。
希望有所帮助!
答案 1 :(得分:0)
只是因为以后有人发现这个,并且想知道,我通过在视图中基本取出对viewmodel的静态引用来解决这个问题。
<viewmodel:modelB x:Key="viewModel"/>
正如斯科特建议首先注册类型,然后是该类型的实例,然后解析我的继承视图,然后解析基本视图(当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();
}
}
正如我所说,这解决了这个问题,但我希望有一种更清晰的方式来使用继承的视图及其模型。其中我仍在寻找,但如果这有助于其他任何坚持这一点的人,那么很棒。