RegionManager неправильно вводит - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь передать наше приложение, которое использовало старую Prism 4.0, до последней версии Prism 7.1.0.431

Я почти закончил, все компилируется.Внедрение зависимостей было обновлено для использования последней версии Unity.Таким образом, все кажется верным, как я вижу, инъекция работает несколько.

Хотя у меня все еще есть проблема с загрузкой модуля: менеджер области не может быть решен.Я думаю, что чего-то не хватает в моем коде инициализации, но не могу найти соответствующую документацию по этому вопросу.Попробуйте пробовать все примеры Prism.Wpf, но можете найти соответствующий код.

Вставка менеджера региона в модуле, вероятно, не очень хорошая практика из кода, который я вижу при поиске ответа на мою проблему, но имейте в видуСо мной, прямо сейчас, это огромное приложение, и я бы хотел избежать как можно большего изменения:

Вот ошибка исключения, которую я имею:

ИСКЛЮЧЕНИЕ: Prism.Modularity.ModuleInitializeException: исключение произошло при инициализации модуля 'AdvancedExportModule'.- Сообщение об исключении было следующим: не удалось разрешить зависимость, type = 'Codex.Modules.AdvancedExport.AdvancedExportModule', name = '(none)'.Исключение произошло во время: при разрешении.Исключение: InvalidOperationException - Текущий тип, Prism.Regions.IRegionManager, является интерфейсом и не может быть создан.Вам не хватает сопоставления типов?

Не хватает ли у меня кода инициализации для того, чтобы RegionManager отображался и корректно вводился Unity?

Вот пример кода, который я попытался простобольшинство из них и, надеюсь, вам достаточно понять, что не так ... Это мой App.xaml:

<prism:PrismApplication x:Class="Codex.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism="http://prismlibrary.com/">
	<Application.Resources>
		<ResourceDictionary Source="Resources/Merged.xaml"/>
	</Application.Resources>
</prism:PrismApplication>

И в моем коде позади App.xaml.cs

    namespace MyNamespace
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Reflection;
    using System.Runtime.InteropServices;
    using System.Windows;
    using System.Windows.Threading;

    using Prism.Ioc;
    using Prism.Logging;
    using Prism.Modularity;
    using Prism.Unity;

    public partial class App : PrismApplication
    {
        private static ILoggerFacade Logger { get; set; }

        public static void Main()
        {
            var application = new App();
            application.InitializeComponent();
            application.Run();
        }

        protected override void OnStartup(StartupEventArgs startupEventArgs)
        {           
            base.OnStartup(startupEventArgs);
        }

        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            var modulesFilePaths = new Dictionary<string, string>();
            modulesFilePaths.Add("Namespace.Modules.Module1.dll", "Namespace.Modules.AdvancedExport.Module1Module");

            var pathToExecutingLibrary = Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName;

            foreach (KeyValuePair<string, string> moduleFilePath in modulesFilePaths)
            {
                var referenceUri = Path.Combine(pathToExecutingLibrary, moduleFilePath.Key);
                var assembly = Assembly.LoadFrom(referenceUri);
                var type = assembly.GetType(moduleFilePath.Value);

                moduleCatalog.AddModule(
                    new ModuleInfo(type)
                    {
                        ModuleName = type.Name,
                        Ref = referenceUri,
                        InitializationMode = InitializationMode.WhenAvailable
                    });
            }

            moduleCatalog.Initialize();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            ConfigureViewModelLocator();
            var containerExtension = CreateContainerExtension();
            containerRegistry.RegisterInstance(containerExtension);

            // These methods have been commented out they are use to register all the types of the application.
            //RegisterSettings(containerRegistry);
            //RegisterServices(containerRegistry);
            //RegisterHandlers(containerRegistry);
            //RegisterWrappers(containerRegistry);

            containerRegistry.RegisterInstance(Dispatcher.CurrentDispatcher);
        }

        protected override Window CreateShell()
        {
            Window mainShell = Container.Resolve<MainShell>();
            return mainShell;
        }
    }
}

1 Ответ

0 голосов
/ 04 декабря 2018

Вы делаете слишком много, и в ваших переопределениях есть неправильные вещи.Пример: RegisterTypes должен просто регистрировать типы ...

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    // this has already been called by the base class: ConfigureViewModelLocator();
    // this has also been called by the base class: var containerExtension = CreateContainerExtension();
    // containerRegistry.RegisterInstance(containerExtension);

    // These methods have been commented out they are use to register all the types of the application.
    //RegisterSettings(containerRegistry);
    //RegisterServices(containerRegistry);
    //RegisterHandlers(containerRegistry);
    //RegisterWrappers(containerRegistry);

    containerRegistry.RegisterInstance(Dispatcher.CurrentDispatcher);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...