1

オンラインで入手できるMVVMの例で一般的に言及されている基本的な設計パターンを使用して、すべてのMVVMアプリケーションを作成しています。私がフォローしているパターンを以下に説明します。

モデル

このセクションには、プロパティとインターフェイス IDataService などを含む DTO クラスが含まれます。

 public class Employee
 {
   public string EmployeeName { get; set; }
   public string EmployeeDesignation { get; set; }
   public string EmployeeID { get; set; }
 }

public interface IDataService
{
  public Task<Employee> GetEmployeeLst();
}

プロキシー

このレイヤーには、次のような IDataservice を実装する Dataservice 呼び出しが含まれています。

public class DataService : IDataService
{
   public async Task<Employee> GetEmployeeLst()
   {
     // Logic to get employee data from HTTPClient call
   }
}

ビューモデル

このレイヤーには、ViewModel と、すべてのデータを受け取るモデルおよびプロキシ レイヤーへの参照が含まれています。

public class BaseViewModel
{
    public BaseViewModel(INavigationService nav, IDataService data, IAESEnDecrypt encrypt, IGeoLocationService geoLocation, IMessageBus msgBus, ISmartDispatcher smtDispatcher)
    {
    }

    // This also include common methods and static properties that are shared among most of the ViewModels
}

すべての ViewModel は BaseViewModel を継承します。各 viewModel には、UI がイベントをトリガーしたときに実行される Delegatecommand も含まれています。次に、プロキシ層で DataService を呼び出してサーバーからデータを取得し、ビジネス ロジックを実行して、ビューにバインドされた ViewModel にプロパティを設定します。ビューごとに、ビューのデータコンテキストにバインドされた VM があります。ViewModel はアニメーションの開始も担当します。トリガーを使用してストーリーボードを開始します。これは、VM の列挙型にバインドされ、これらのトリガーの状態変更のために次の例のようになります。 mvvm-Friendly-visual-state-management-with-windows-phone-7/

意見

このレイヤーには、GeoLocation Service、AES 暗号化、ビュー間の NavigationService などの特定の依存関係を実装したすべてのビュー、ユーザー コントロール、およびビジネス ロジックがあります。

すべてのビューには .xaml および .xaml.cs ファイルがあります。.xaml.cs ファイルで、ビューのデータ コンテキストを次のように VM にバインドしました。

this.DataContext = App.IOConatiner.GetInstance<DashboardViewModel>();

ここからすべてのバインディングが発生します。

私の問題は、最近、このパターンがSOLID設計パターンに従っていないという知識があったことです。これは、質問のこの回答で知ったものです: Simple InjectorはBaseClassに複数の依存関係を注入します

前の質問の回答で与えられた提案に従って、デザインを変更しようと懸命に努力しています。しかし、次のようなものを取得できません。

  1. 現在、View Datacontext は ViewModel にバインドされているため、すべてのコントロールは VM のプロパティによって制御されます。これを Processor/Service または DialogHandler を使用して上記のパターンに変更するにはどうすればよいですか?

  2. UI 要素の command プロパティにバインドされた Delegatecommands を使用しています。これらのコマンドを実行するとアニメーションのように特定のアクションが発生し、ユーザーコントロールが表示されます。コマンドパターンでそれを行う方法は?

  3. 可能な限り最善のアプローチでこれらすべての変更に対応するために、現在の実装の変更を開始するにはどうすればよいですか?

4

2 に答える 2

2

まず、あなたの質問に対する答え 3

可能な限り最善のアプローチでこれらすべての変更に対応するために、現在の実装の変更を開始するにはどうすればよいですか?

これは、実行する必要がある最初のステップです。これは、現在のコードをスマートにリファクタリングした場合ではありません。一歩下がって、アプリケーションを設計する必要があります。(再)デザインについての素敵なブログを読んだことがあります。

コードを書き始める前に、ユーザーに表示する基本的なビューの種類をいくつ定義しますか? 例えば:

  1. (任意のタイプの)データを表示するだけ
  2. データの編集
  3. ユーザーに警告する
  4. ユーザーに入力を求める
  5. ...

さまざまな要件を定義すると、これを、提供するジョブに合わせて作成された特定のインターフェイスに変換できます。たとえば、ユーザーがデータを編集できるようにするビューには、通常、次のようなインターフェイスがあります。

public interface IEditViewModel<TEntity>
{
    public EditResult<TEntity> EditEntity(TEntity entityToEdit)();
}

この設計のすべての詳細が整ったら、ビューをユーザーにどのように表示するかを決定する必要があります。このタスクを処理するために、別のインターフェイスを使用しました。ただし、ナビゲーション サービスにこの種のタスクを処理させることもできます。

このフレームワークが整ったら、実装のコーディングを開始できます。

現在、View Datacontext は ViewModel にバインドされているため、すべてのコントロールは VM のプロパティによって制御されます。これを Processor/Service または DialogHandler を使用して上記のパターンに変更するにはどうすればよいですか?

これはこのデザインでも変わりません。ビューをビューモデルにバインドし、データコンテキストをビューモデルに設定します。多くのビューでは、Caliburn Micro のような MVVM フレームワークを使用すると便利です。これにより、 Convention over Configurationに基づいて、多くの MVVM が実行されます。このモデルから始めると、学習曲線がさらに高くなるため、手動で始めることをお勧めします。このような MVVM ツールの裏で何が起こっているかを学習します。

UI 要素の command プロパティにバインドされた Delegatecommands を使用しています。これらのコマンドを実行するとアニメーションのように特定のアクションが発生し、ユーザーコントロールが表示されます。コマンドパターンでそれを行う方法は?

ここで言及したコマンド パターンが、前の回答でアドバイスしたコマンド パターンであるかどうかはわかりません。もしそうなら、このブログを読み直す必要があると思います。これは、この質問で意味していると思われるコマンドとはまったく関係がないからです。

アニメーションとそのようなものは、ビューモデルではなく、ビューの責任です。したがって、ビューはこれらすべてのものを処理する必要があります。XAML には、これを処理する方法がたくさんあります。ここで説明できることは以上です。いくつかのアイデア: TriggersDependency Properties

別のオプション: コード ビハインド! ロジックが純粋にビュー関連の IMO である場合、このコードをビューのコード ビハインドに配置することは大罪ではありません。ただ、灰色の領域のことをやりたがらないでください。

ビューモデルでメソッド呼び出しを実行するだけのコマンドの場合、ICommand は引き続き可能であり、Caliburn などの MVVM ツールはこれを自動的に行います...

それでも:基本クラスを緩めます....

于 2015-02-11T22:32:54.543 に答える
0

ビューモデルの基本クラスがこれらのサービス自体を利用しない場合、ビューモデルの基本クラスにこれらすべてのサービスを注入するのはなぜですか?

必要なサービスを必要とする派生ビューモデルに注入するだけです。

于 2015-02-08T19:51:26.387 に答える