Unity Bootstrapper我的配置容器在调用视图模型时不起作用
我使用棱镜6.1。我在Bootstrapper
类的方法中设置Unity配置。但是,当Prism框架尝试调用视图模型时,它不能创建它,并抛出异常'没有为此对象定义的无参数构造函数。'。Unity Bootstrapper我的配置容器在调用视图模型时不起作用
Bootstrapper.cs
public class Bootstrapper: UnityBootstrapper
{
...
protected override void ConfigureContainer()
{
base.ConfigureContainer();
this.Container.RegisterType<IMyService, MyService>(new ContainerControlledLifetimeManager());
this.Container.RegisterType<MyFormViewModel>(new ContainerControlledLifetimeManager());
}
...
}
MyFormModule.cs
public class MyFormModule : IModule
{
private readonly IRegionViewRegistry regionViewRegistry;
public SkypeActionModule(IRegionViewRegistry registry)
{
this.regionViewRegistry = registry;
}
public void Initialize()
{
regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(Views.MyFormView));
}
}
MyFormViewModel.cs
public class MyFormViewModel : BindableBase
{
private readonly IMyService myService;
public SkypeActionViewModel(IMyService myService)
{
this.myService = myService;
}
...
}
在这一行中抛出异常:
regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(Views.MyFormView));
在prism documentation说明如何配置统一,但这是在Module类(在我的情况下是MyFormModule
)。我不明白,因为这样,我需要在每个模块中进行配置,并且我的模块类中没有对象this.container.RegisterType
。
在其他链接中,我发现一些类似于“MEF”配置的配置,其中“DI”配置在方法中。但它不适用于我,或者我的配置中缺少的东西。
编辑 我在我的模块类中包含容器。但我有同样的问题。我想这是正常的,因为问题是当Prism创建视图模型类MyFormViewModel
。
public class MyFormModule : IModule
{
private readonly IRegionViewRegistry regionViewRegistry;
private readonly IUnityContainer container;
public MyFormModule(IRegionViewRegistry registry, IUnityContainer container)
{
this.regionViewRegistry = registry;
this.container = container;
}
public void Initialize()
{
this.container.RegisterType<IMyService, MyService>(new ContainerControlledLifetimeManager());
this.container.RegisterType<MyFormViewModel>();
this.container.RegisterType<MyFormView>();
regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(MyFormView));
}
}
编辑
解决方案:我发现在this question on stackoverflow
解决方案上Bootstrap
类创建方法BindViewModelToView
:
public void BindViewModelToView<TViewModel, TView>()
{
ViewModelLocationProvider.Register(typeof(TView).ToString(),() => Container.Resolve<TViewModel>());
}
,然后,在方法ConfigureViewModelLocator
在Bootstrap
级呼叫所有视图模型它可欣赏绑定:
protected override void ConfigureViewModelLocator()
{
BindViewModelToView<ViewAVM, ViewA>();
BindViewModelToView<ViewAVM, ViewB>();
}
你怎么知道棱镜创建视图模型?你在用ViewModelLocator.AutoWireViewModel="True"
吗?
如果是这样,要在引导程序,以确保您的容器用于解决视图模型做一些像
ViewModelLocationProvider.SetDefaultViewModelFactory(type =>
{
return Container.Resolve(type);
});
...
我没有使用'ViewModelLocator.AutoWireViewModel =“True”'。但我找到了解决方案。我会创建一个答案。 –
对不起,是的,我在我的XAML文件中使用'ViewModelLocator.AutoWireViewModel =“True”' –
你可以有容器注入模块定义类像任何其他依赖项,所以你的模块可以像引导程序一样调用'container.RegisterType'。 'IRegionManager' ... – Haukinger
@Haukinger我在我的Module类中包含'IUnityContainer',但我遇到了同样的问题。 –