7

免責事項:MVVM / MVC / MVP / MVWhateverの経験はありませんが、UI分離パターンを使用するのはこれが初めてです。

起動時に、アプリケーションが機能するために必要な構成ファイルからデータをロードする必要があります。

現時点では、の起動時に構成ファイルを読み取っており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アプリはそのための優れたUIです。 )
したがって、ビューモデルはモデルのインスタンスを作成し、解析メソッドを呼び出します...構成ファイルのデータが無効な場合は例外をスローします。

これを「MVVMの方法」で処理するにはどうすればよいですか?
ビューモデルで例外をキャッチし、そこからアプリケーション全体を閉じるだけでは、私には違和感があります。


編集:

なぜ私が使用していないのかについてのウィルのコメントに答えるためにapp.config

そこから値のペアのいくつかの名前付き「セット」をロードする必要があるため、「特別な」構成ファイルを使用しています。これがサンプルファイルです
基本的に、それはDictionary<string, List<ClassWithTwoStringProperties>>です。

  1. AFAIKは、app.configこのようなデータをサポートしていないため、私ができる唯一のことは、すべてを1つのプロパティのblobとして保存しapp.config、それでも自分で解析を行うことです。
    ->したがって、WPFアプリのどこかから解析を呼び出す必要があります。
  2. シンプルで人間が編集できるフォーマットが欲しかった
  3. WPFアプリはライブラリの優れたUIであり、ライブラリにも構成ファイルが必要です
4

1 に答える 1

4

私は、このやり方は間違っていると思います。

app.config永続化されたデータ (データベース、ファイルなど) について考える必要があります。MVVM の方法で永続化されたデータにアクセスする場合は、サービス (のようなものIApplicationDataService) を作成し、コードからこのサービスの実装を呼び出す必要がありMainWindowViewModelます。このサービスをいくつServiceLocatorかから見つけたり、IoC コンテナーを介して注入したりすると、より MVVMish になります。これは、後で単体テストを作成するのに役立ちます。

サービスの実装は、ビュー モデルの初期化されたモデル インスタンスに戻る必要があります。このようなもの:

public ApplicationDataService : IApplicationDataService
{
  public ApplicationModel LoadApplicationData()
  {
      // process app.config here
  } 
}

public ViewModelBase<TModel>
{
  public TModel Model
  {
    get { return model.Value; }
  }
  private readonly Lazy<TModel> model = new Lazy(GetModel);

  protected abstract TModel GetModel();
}

public MainWindowViewModel<ApplicationModel> : ViewModelBase
{
   protected override ApplicationModel GetModel()
   {
      try
      {
        var dataService = ServiceLocator.GetService<IApplicationDataService>();
        return dataService.LoadApplicationData();
      }
      catch (AnyException e)
      {
         // oops!
      }
   }
}
于 2012-08-19T18:10:11.953 に答える