2012-02-10 13 views
2

私はWPFアプリケーションを起動するためにPrism UnityExtensionsブートストラップクラスを使用しています。 unityextensionsブートストラップが実行されている間にアプリケーションをシャットダウンするにはどうすればよいですか?bootstrapperクラスの実行中にアプリケーションをシャットダウンする方法はありますか?

下記の私のbootstrapperクラスを参照してください。 SomeClassオブジェクトは、カスタム例外(致命的)をスローする可能性があります。カスタム例外がスローされた場合は、アプリケーションを終了する必要があります。私はApplication.Current.Shutdown()を使用してアプリケーションをシャットダウンしています。

しかし、CreateShell()メソッドでdatacontextを設定すると、ブートストラップコードが実行され続け、 "ResolutionFailedException was unhandled"例外エラーが発生します。明らかに、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(); 
    } 
} 

答えて

2

you'reは、この時点で、あなたのアプリケーションのOnStartupを実行するため、この現象が、発生します。私は、あなたがそのようにそれを行うとします

protected override void OnStartup(StartupEventArgs e) 
{ 
    new AgentBootstrapper().Run(); 
} 

OnStartupは、App缶シャットダウンする前に、完了する必要があるので、ブートストラップは実行を継続します。

... 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

関連する問題