Unity Bootstrapper我的配置容器在调用视图模型时不起作用

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 *

解决方案上Bootstrap类创建方法BindViewModelToView

public void BindViewModelToView<TViewModel, TView>() 
{ 
    ViewModelLocationProvider.Register(typeof(TView).ToString(),() => Container.Resolve<TViewModel>()); 
} 

,然后,在方法ConfigureViewModelLocatorBootstrap级呼叫所有视图模型它可欣赏绑定:

protected override void ConfigureViewModelLocator() 
{ 
    BindViewModelToView<ViewAVM, ViewA>(); 
    BindViewModelToView<ViewAVM, ViewB>(); 
} 
+0

你可以有容器注入模块定义类像任何其他依赖项,所以你的模块可以像引导程​​序一样调用'container.RegisterType'。 'IRegionManager' ... – Haukinger

+0

@Haukinger我在我的Module类中包含'IUnityContainer',但我遇到了同样的问题。 –

你怎么知道棱镜创建视图模型?你在用ViewModelLocator.AutoWireViewModel="True"吗?

如果是这样,要在引导程序,以确保您的容器用于解决视图模型做一些像

ViewModelLocationProvider.SetDefaultViewModelFactory(type => 
{ 
    return Container.Resolve(type); 
}); 

...

+0

我没有使用'ViewModelLocator.AutoWireViewModel =“True”'。但我找到了解决方案。我会创建一个答案。 –

+0

对不起,是的,我在我的XAML文件中使用'ViewModelLocator.AutoWireViewModel =“True”' –