0

我正在使用 Prism 7.2 开发 WPF 应用程序。我有一个模块,它实现了IModule接口,我在RegisterTypes方法中注册了视图和视图模型,例如:

containerRegistry.Register<IPanelOptimizationViewModel, PanelOptimizationViewModel>();

当我尝试解决实现时出现问题:

var vm = containerProvider.Resolve<IPanelOptimizationViewModel>();

因此我得到以下Unity.ResolutionFailedException:“解决失败并出现错误:没有公共构造函数可用于类型 XXX.Infrastructure.Interfaces.IView。”

该类PanelOptimizationViewModel派生自一个基类:

public class PanelOptimizationViewModel : ViewModelBase, IPanelOptimizationViewModel
{
     public PanelOptimizationViewModel(IPanelOptimizationView view, IPanelOptimizationInputViewModel inpVM) : base(view)
}

ViewModelBase看起来像这样:

 public class ViewModelBase : BindableBase, IViewModel
 {
     public IView View { get; set; }

     public ViewModelBase(IView view)
     {
         View = view;
         View.ViewModel = this;
     }
 }

接口IViewIViewModel定义在一个通用的基础设施项目中。它们没有在容器中的任何地方注册,但是如果我删除IPanelOptimizationInputViewModel参数,则不会引发运行时异常 - 导致我认为我也不需要这样做。

据我所知,Unity.Container将使用“最参数化”的构造函数(请参阅Unity not using the default constructor of the class),但我无法在 Register 方法中提供参数来指定这一点,因为显然可以之前(Prism 7 之前的容器抽象),使用 RegisterType 方法。

如何解决这个问题?是否存在允许我为构造函数注入设置注册的 Prism.Ioc.IContainerRegistry.Register 方法的重载?

我应该直接使用 Unity 容器吗?

基本上,我正在尝试将子视图的视图模型注入我的“主”视图模型的构造函数中,但只要在基类上调用错误的构造函数并使用错误的参数集,这并不顺利......(如果这是正在发生的事情)。

不用说,所有的子视图和视图模型都已经在模块的 RegisterTypes 方法中注册了。

对此的任何帮助将不胜感激

4

1 回答 1

0

我应该直接使用 Unity 容器吗?

GetContainer()是的,您可以通过调用扩展方法(针对您的容器)来规避 Prism 对容器的“抽象” 。

containerRegistry.GetContainer() // here you get a plain IUnityContainer
                 .RegisterType( ... );
于 2019-09-25T11:27:18.780 回答