我正在使用 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;
}
}
接口IView
和IViewModel
定义在一个通用的基础设施项目中。它们没有在容器中的任何地方注册,但是如果我删除IPanelOptimizationInputViewModel
参数,则不会引发运行时异常 - 导致我认为我也不需要这样做。
据我所知,Unity.Container
将使用“最参数化”的构造函数(请参阅Unity not using the default constructor of the class),但我无法在 Register 方法中提供参数来指定这一点,因为显然可以之前(Prism 7 之前的容器抽象),使用 RegisterType 方法。
如何解决这个问题?是否存在允许我为构造函数注入设置注册的 Prism.Ioc.IContainerRegistry.Register 方法的重载?
我应该直接使用 Unity 容器吗?
基本上,我正在尝试将子视图的视图模型注入我的“主”视图模型的构造函数中,但只要在基类上调用错误的构造函数并使用错误的参数集,这并不顺利......(如果这是正在发生的事情)。
不用说,所有的子视图和视图模型都已经在模块的 RegisterTypes 方法中注册了。
对此的任何帮助将不胜感激