Prism 7 создает ResolutionFailedException: общедоступный конструктор для типа недоступен (интерфейс) - PullRequest
0 голосов
/ 25 сентября 2019

Я разрабатываю приложение WPF, используя Prism 7.2.У меня есть модуль, который реализует интерфейс 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 не использует конструктор по умолчанию класса ), но я не могу предоставить параметр в методе Register, чтобы указатьэто, как можно было раньше (контейнерная абстракция до Prism 7), с помощью метода RegisterType.

Как решить эту проблему?Есть ли перегрузка метода Prism.Ioc.IContainerRegistry.Register, который позволяет мне настроить регистрацию для внедрения конструктора?

Должен ли я работать напрямую с контейнером Unity?

По сути, яя пытаюсь внедрить модель представления дочернего представления в конструктор моей "основной" модели представления, но это не работает, если в базовом классе вызывается неправильный конструктор с неправильным набором параметров ... (если эточто происходит).

Излишне говорить, что все дочерние представления и модели представления были зарегистрированы в методе RegisterTypes в модуле.

Любая помощь по этому вопросу будет принята с благодарностью

1 Ответ

0 голосов
/ 25 сентября 2019

Должен ли я работать напрямую с контейнером Unity?

Да, вы можете избежать "абстракции" контейнера от Prism, вызвав метод расширения GetContainer() (для вашего контейнера).

containerRegistry.GetContainer() // here you get a plain IUnityContainer
                 .RegisterType( ... );
...