Недавно у меня была возможность создать новое приложение на основе призмы.Я использовал версию 6.3 довольно долго, но увидел, что призма 7 вышла из предварительной версии и хотела попробовать.Я создал новое приложение Prism, используя пакет шаблонов Prism, и все работало как положено из коробки.Я обновил модель представления, как это обычно делается в 6.3, для передачи в Контейнер, чтобы я мог разрешить некоторые объекты, которые позднее предоставили бы информацию для представления, в 6.3 я бы сделал следующее:
public MainWindowViewModel(IRegionManager aRegionManager,
IUnityContainer aUnityContainer) : base()
Теперь в 7.1.0.431 я попытался сделать то же самое, но обновил интерфейсы для учета новой абстракции IOC.
public MainWindowViewModel(IRegionManager aRegionManager,
IContainerProvider aContainerProvider,
IContainerRegistry aContainerRegistry) : base()
Это создает исключение из ViewModelLocator.AutoWireViewModel для параметров IContainerX.
System.Exception {Unity.Exceptions.ResolutionFailedException}
{"Resolution of the dependency failed, type = 'Sample.ViewModels.MainWindowViewModel', name = '(none)'.\nException occurred while: while resolving.\nException is: InvalidOperationException - The current type, Prism.Ioc.IContainerProvider, is an interface and cannot be constructed. Are you missing a type
Это действует так, как будто я пропускаю ссылку, но этот тип передается в вызов RegisterTypes приложения, поэтому все ссылки должны быть найдены.Я делаю что-то не так для новой версии 7.X?
РЕДАКТИРОВАТЬ: Per @ mnistic
Вот код из пакета шаблонов, предоставленного App.xaml.csгде передается IContainerRegistry.
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//containerRegistry is a valid instance here
}
Обновление :
Немного больше, IContainerRegistry, который был передан в RegisterTypes, перечисляет все типы / интерфейсыкоторые доступны на момент вызова метода.Он имеет зарегистрированный экземпляр IUnityContainer.Я выбрал Unity для IOC, когда создавал проект, но я предположил, может быть, неправильно, что IContainerRegistry скрывал клиентов от фактической реализации.Если я обновлю конструктор ViewModel, чтобы получить объект IUnityContainer, он разрешается правильно.
public MainWindowViewModel(IRegionManager aRegionManager,
IUnityContainer aContainerProvider) : base()
Это желаемое поведение?