Контейнер связи зарегистрированного типа с заголовком окна оболочки - PullRequest
0 голосов
/ 07 января 2019

У меня есть приложение Prims MVVM, которое использовало класс Bootstrapper для запуска приложения и главного окна. Bootstrapper устарел, поэтому я переключил его на PrismApplication. Я добавил класс, который оборачивает последовательное соединение и выставляет события, которые запускаются при изменении состояний последовательного класса (например, подключен, отключен и т. Д.). Для создания экземпляра этого компонента я использую RegisterSingleton:

public partial class App : PrismApplication
{
    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {            
        containerRegistry.RegisterSingleton<IMessages, MessageBuilder>();
        containerRegistry.RegisterSingleton<AbstractLibSerial, LibSerialVariant1>();
        containerRegistry.RegisterSingleton(typeof(SettingsModel));
    }

    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
    {
        base.ConfigureModuleCatalog(moduleCatalog);            

        moduleCatalog.AddModule(typeof(MainModule.MainModule));
        moduleCatalog.AddModule(typeof(SettingsModule.SettingsModule));            
    }

    protected override Window CreateShell()
    {
        return (Window)new Shell();    
    }
}

Shell.xaml:

<Window x:Class="VibeOR.Desktop.Shell"
    xmlns:prism="http://www.codeplex.com/prism"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:VibeOR.Desktop"
    mc:Ignorable="d"
    Title="Vibe Base Station" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">

    <ContentControl Name="MainRegion" prism:RegionManager.RegionName="MainRegion"/>  

Когда я запускаю приложение, я вижу, что RegisterTypes вызывается до CreateShell, поэтому я надеялся, что смогу связать события из экземпляра синглтона LibSerialVariant1 с окном заголовка из класса Shell. Тем не менее, вы можете увидеть в приведенном выше коде, что я вручную создаю экземпляр оболочки (новый Shell ()). Я не уверен, как получить доступ к зарегистрированным типам контейнеров, чтобы связать их с недавно созданным объектом оболочки?

Любой вклад будет грандиозным. Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Спасибо @Haukinger! Теперь я создаю экземпляр LibSerial в главном приложении и связываю события с классом Shell, используя стандартные события Windows (поскольку Shell основана на классе Window).

public partial class App : PrismApplication
{
    private AbstractLibSerial _lib;

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {            
        containerRegistry.RegisterSingleton<IMessageBuilder, MessageBuilderVariant1>();
        containerRegistry.RegisterSingleton<AbstractLibSerial, LibSerialVariant1>();
        containerRegistry.RegisterSingleton(typeof(SettingsModel));
        var _container = containerRegistry.GetContainer();
        _lib = _container.Resolve<LibSerialVariant1>();
        containerRegistry.RegisterInstance<AbstractLibSerial>(_lib);
    }
    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
    {
        base.ConfigureModuleCatalog(moduleCatalog);            


        moduleCatalog.AddModule(typeof(MainModule.MainModule));
        moduleCatalog.AddModule(typeof(SettingsModule.SettingsModule));            
    }

    protected override void InitializeShell(Window shell)
    {
        base.InitializeShell(shell);
        _lib.SerialEvent += ((Shell)shell).OnSerialEvent;
    }
    protected override Window CreateShell()
    {
        return (Window)new Shell();
    }

}
0 голосов
/ 07 января 2019

Для создания экземпляра этого компонента я использую RegisterSingleton

Это похоже на недоразумение - регистрация типа не создаст экземпляр.

Если вы хотите, чтобы синглтон был создан и зарегистрирован, вы можете зарегистрировать экземпляр (экземпляры всегда одиночные):

_container.RegisterInstance<IInterface>( _container.Resolve<Implementation>() );

Но вы должны быть осторожны с этим, потому что нет способа гарантировать, что все зависимости Implementation зарегистрированы (они могут быть из других модулей).

...