我有一个Prims应用程序,它使用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单例中的事件链接到CreateShell类的标题窗口。但是,您可以在上面的代码中看到,我正在手动实例化shell (new ())。我不确定如何访问已注册的容器类型,以便将它们与新实例化的shell对象链接起来?
任何投入都将是巨大的。谢谢!
发布于 2019-01-07 19:13:22
为了实例化这个组件,我使用
RegisterSingleton
这看起来像是一个误解-注册一个类型不会创建一个实例。
如果希望创建和注册单例,则可以注册实例(实例始终是单例):
_container.RegisterInstance<IInterface>( _container.Resolve<Implementation>() );但是您必须小心这一点,因为无法保证Implementation的所有依赖项都已注册(它们可能来自其他模块)。
发布于 2019-01-08 17:18:33
谢谢@Haukinger!我现在在主应用程序中实例化LibSerial,并使用标准的windows事件将事件连接到Shell类中(因为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();
}
}https://stackoverflow.com/questions/54079931
复制相似问题