Загрузка файлов конфигурации/обработка ошибок при запуске в приложении WPF/MVVM

Отказ от ответственности :У меня нет опыта работы с MVVM/MVC/MVP/MVWhatever, это моя первая попытка использовать какой-либо шаблон разделения пользовательского интерфейса.

При запуске моему приложению необходимо загрузить данные из файла конфигурации, которые необходимы для работы приложения.

На данный момент я читаю файл конфигурации при запуске в App.xaml.csи передаю содержимое файла в модель представления :

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        string configFile = "settings.txt";
        string[] config = File.ReadAllLines(configFile);

        var window = new MainWindow();
        var viewmodel = new MainWindowViewModel(config);
        window.DataContext = viewmodel;
        window.Show();
    }
}

. 1. Это «правильный» способ MVVM?
Я уверен, что этот способ лучше, чем чтение файла прямо в модели представления (вот как я сделал это сначала ), но я не уверен, что App.xaml.csэто вообще правильное место для чтения конфига файлы.

2. Где и как обрабатывать ошибки?
Данные из файла конфигурации необходимы для приложения.
Поэтому, если файл отсутствует или пуст, или если данные в файле недействительны, мне нужно отобразить сообщение об ошибке и выйти из приложения.

Моей первой попыткой было бы поместить это и в App.xaml.cs:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        string configFile = "settings.txt";

        if (!File.Exists(configFile))
        {
            MessageBox.Show("config file missing");
            Application.Current.Shutdown();
            return;
        }

        string[] config = File.ReadAllLines(configFile);

        if (config.Count() == 0)
        {
            MessageBox.Show("config file empty");
            Application.Current.Shutdown();
            return;
        }

        var window = new MainWindow();
        var viewmodel = new MainWindowViewModel(config);
        window.DataContext = viewmodel;
        window.Show();
    }
}

. Но это не выглядит "правильным" для меня. Мне уже было неудобно загружать туда файл (см. первый пример ), так что это еще хуже.

Примечание :Я знаю, что мне, вероятно, не следует здесь напрямую вызывать Messagebox.Show.
Обратите внимание, что это , а не , о чем я здесь спрашиваю -. Я знаю, что должен заменить его чем-то более похожим на MVVM -, но дело в том, что :мне все равно придется звонить. это (, а затем откуда-то закройте приложение ).
На самом деле я хочу знать, подходит ли App.xaml.csдля этого!

3. Плюс,У меня есть другая ошибка, которую нужно обработать:
Фактический анализ файла конфигурации выполняется моделью (. модель является частью существующей библиотеки, а приложение WPF, которое я здесь создаю, — просто хороший пользовательский интерфейс для этого).
Таким образом, модель представления создает экземпляр модели и вызывает метод синтаксического анализа... который выдает исключение, если данные из файла конфигурации недействительны.

Как мне справиться с этим «способом MVVM»?
Просто ловить исключение в модели представления и закрывать оттуда все приложение мне кажется неправильным.


РЕДАКТИРОВАТЬ:

Чтобы ответить на комментарий Уилла о том, почему я не используюapp.config:

Я использую «специальный» файл конфигурации, потому что мне нужно загрузить оттуда несколько именованных «наборов» пар значений. Вот пример файла .
По сути, это Dictionary>.

  1. Насколько я знаю, app.configне поддерживает такие данные, поэтому единственное, что я мог сделать, это сохранить все это как большой двоичный объект в одном свойстве в app.configи по-прежнему выполнять синтаксический анализ самостоятельно.
    --> поэтому мне все равно придется вызывать синтаксический анализ откуда-то из приложения WPF.
  2. Я хотел простой редактируемый формат
  3. приложение WPF — это просто приятный пользовательский интерфейс для библиотеки, и мне также нужен файл конфигурации в библиотеке

5
задан Christian Specht 19 August 2012 в 21:28
поделиться