Как закрыть приложение, пока класс загрузчика еще работает? - PullRequest
2 голосов
/ 11 февраля 2012

Я использую класс начальной загрузки Prism UnityExtensions для запуска моего приложения WPF.Как закрыть приложение, пока загрузчик unityextensions все еще работает?

См. Мой класс загрузчика ниже.Объект SomeClass может выдавать пользовательское исключение (фатально).Если выброшено пользовательское исключение, мне нужно закрыть приложение.Я использую Application.Current.Shutdown(), чтобы закрыть приложение.

Однако код загрузчика продолжает выполняться, и я получаю ошибку исключения «ResolutionFailedException is unhandled» при установке контекста данных в методе CreateShell().Очевидно, что метод и интерфейс SomeClass не были зарегистрированы в контейнере из-за блока catch.

Похоже, что код загрузчика продолжает выполняться после вызова Application.Current.Shutdown().Мне нужно остановить загрузочный код сразу после вызова 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();
  }
}

1 Ответ

2 голосов
/ 11 февраля 2012

Это происходит, потому что вы выполняете 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...