2

Prism UnityExtensions ブートストラップ クラスを使用して WPF アプリケーションを開始しています。unityextensions ブートストラップがまだ実行されている間にアプリケーションをシャットダウンするにはどうすればよいですか?

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

ただし、ブートストラップ コードは引き続き実行され、メソッドで datacontext を設定すると、「ResolutionFailedException was unhandled」という例外エラーが発生しますCreateShell()。明らかにSomeClass、catch ブロックが原因で、メソッドとインターフェイスはコンテナーに登録されませんでした。

への呼び出しが呼び出された後も、ブートストラップ コードが引き続き実行されているようApplication.Current.Shutdown()です。シャットダウンの呼び出しの直後にブートストラップ コードを停止する必要があります。

を作成せずにアプリケーションをシャットダウンする方法はありResolutionFailedExceptionますか?

ResolutionFailedException 例外の詳細 --> 依存関係の解決に失敗しました。タイプ = "SomeClass"、名前 = "(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();
  }
}
4

1 に答える 1

2

この動作は、現時点でアプリケーションの 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();
    }
}
于 2012-02-11T10:18:30.177 に答える