2012-02-10 98 views
2

我正在使用Prism UnityExtensions引導程序類來啓動我的WPF應用程序。 unityextensions引導程序仍在運行時如何關閉應用程序?如何在引導程序類仍在運行時關閉應用程序?

請參閱下面的我的引導程序類。 SomeClass對象可能會引發自定義異常(致命)。如果自定義異常被拋出,我需要關閉應用程序。我正在使用Application.Current.Shutdown()來關閉應用程序。

但是,引導程序代碼繼續運行,並且在CreateShell()方法中設置datacontext時,出現「ResolutionFailedException was unhandled」異常錯誤。顯然,由於catch塊,SomeClass方法和接口未在容器中註冊。

在呼叫Application.Current.Shutdown()的調用被調用後,看起來引導程序代碼繼續運行。我需要在關閉調用之後立即停止引導程序代碼。

任何想法如何關閉應用程序而不創建ResolutionFailedException

ResolutionFailedException異常的詳細信息 - > 分辨率依賴的失敗,TYPE = 「SomeClass的」,名字= 「(無)」。 發生異常時:解析時。 異常是: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(); 
    } 
} 

回答

2

出現此現象,因爲you're此時執行應用程序的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"); 
} 

然後抓住它在啓動():

protected override void OnStartup(StartupEventArgs e) 
{ 
    try 
    { 
     new AgentBootstrapper().Run(); 
    } 
    catch(ApplicationException) 
    { 
     this.Shutdown(); 
    } 
} 
+0

你猜對了!我從OnStartup方法運行引導程序。我沒有意識到OnStartup方法必須在應用程序關閉之前完成運行。我按照你的例子改變了我的代碼,它效果很好。非常感謝您的幫助。 – EnLaCucha 2012-02-13 16:38:34

相關問題