如何在引导程序类仍在运行时关闭应用程序
本文关键字:运行时 应用程序 引导程序 | 更新日期: 2023-09-27 18:24:19
我正在使用Prism UnityExtensions引导程序类来启动我的WPF应用程序。如何在unityextensions引导程序仍在运行时关闭应用程序?
请参阅下面的引导程序类。SomeClass
对象可能引发自定义异常(致命)。如果引发自定义异常,我需要关闭应用程序。我正在使用Application.Current.Shutdown()
关闭应用程序。
但是,引导程序代码仍在运行,在CreateShell()
方法中设置数据上下文时,我收到了一个"ResolutionFailedException was unhandled"异常错误。显然,由于catch块,SomeClass
方法和接口没有向容器注册。
在调用了对Application.Current.Shutdown()
的调用后,引导程序代码似乎继续运行。我需要在调用关机后立即停止引导程序代码。
你知道如何在不创建ResolutionFailedException
的情况下关闭应用程序吗?
ResolutionFailedException异常详细信息-->解析依赖项失败,type="SomeClass",name="(none)"。解析时发生异常。异常为:InvalidOperationException-当前类型SomeClass是一个接口,无法构造。您是否缺少类型映射?
public class AgentBootstrapper : UnityBootstrapper
{
protected override void ConfigureContainer()
{
base.ConfigureContainer();
var eventRepository = new EventRepository();
Container.RegisterInstance(typeof(IEventRepository), eventRepository);
var dialog = new DialogService();
Container.RegisterInstance(typeof(IDialogService), dialog);
try
{
var someClass = new SomeClass();
Container.RegisterInstance(typeof(ISomeClass), SomeClass);
}
catch (ConfigurationErrorsException e)
{
dialog.ShowException(e.Message + " Application shutting down.");
**Application.Current.Shutdown();**
}
}
protected override System.Windows.DependencyObject CreateShell()
{
var main = new MainWindow
{
DataContext = new MainWindowViewModel(Container.Resolve<IEventRepository>(),
Container.Resolve<IDialogService>(),
Container.Resolve<ISomeClass>())
};
return main;
}
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.MainWindow = (Window)Shell;
Application.Current.MainWindow.Show();
}
}
发生这种行为是因为此时您正在执行应用程序的OnStartup。我想你是这样做的:
protected override void OnStartup(StartupEventArgs e)
{
new AgentBootstrapper().Run();
}
在应用程序关闭之前,必须完成OnStartup,以便引导程序继续执行。您可能会抛出另一个异常以退出Run():
... catch (ConfigurationErrorsException e)
{
dialog.ShowException(e.Message + " Application shutting down.");
throw new ApplicationException("shutdown");
}
然后在StartUp()中捕获:
protected override void OnStartup(StartupEventArgs e)
{
try
{
new AgentBootstrapper().Run();
}
catch(ApplicationException)
{
this.Shutdown();
}
}