Отказ от ответственности :У меня нет опыта работы с 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
.
app.config
не поддерживает такие данные, поэтому единственное, что я мог сделать, это сохранить все это как большой двоичный объект в одном свойстве в app.config
и по-прежнему выполнять синтаксический анализ самостоятельно.