1

Visual Studio 2012 を使用して、リモート Web サービスへのサービス参照を追加しました。非同期呼び出しを使用するように構成されています。アプリケーションは、MVVM パターンで WPF を使用します。

1 つのモデル クラスが呼び出され、ビュー モデルで使用できるProjectsプロパティが公開されます。ProjectListにはProjectList、サービスから取得されたプロジェクトのリストが含まれます。

これまでのところ、このサービスを次のようにビュー モデルから呼び出します (実際には、コマンドによって呼び出されます)。

Projects.ProjectList = proxy.getProjectList(username, password);

はい、機能しますが、私が学んだことから、「ビジネスロジック」はビューモデルで処理されるべきではありません。ProjectListでは、ビューがビュー モデルでコマンドを起動したときに、どのように、どこでサービスを呼び出し、モデルのプロパティを設定するのでしょうか?

4

2 に答える 2

0

依存性注入を使用して、ポリモーフィック インターフェイスを ViewModel に渡します。

このインターフェイスでは、Web サービスと通信する関数を定義し、このインターフェイスを具象オブジェクトに実装します。アクセスする必要があるサービス ソースに応じて、必要な具体的なオブジェクトをインスタンス化し、定義したインターフェイスを介して ViewModel に渡します。

このようにして、疎結合とポリモーフィズムのすべての利点を簡単に実現できます...

例えば:

public ProjectListViewModel(IProjectListServiceAgent sa)

public interface IProjectListServiceAgent
{
    GetProjectList(string userName, string password)
}


public SqlProjectListFetcher : IProjectListServiceAgent 
{
   GetProjectList(string userName, string password)
   {
       //Fetch project list using direct SQL server access.
   }
}

public WebServiceProjectListFetcher : IProjectListServiceAgent 
{
   GetProjectList(string userName, string password)
   {
       //Fetch project list using web service.
   }
}
于 2013-01-30T20:29:55.193 に答える
0

依存関係を ViewModel に渡してプロキシを使用します。私は非同期システムで常に同期コードを使用することを好みます。そのため、プロキシにはメソッド proxy.GetCustomerList があり、async キーワードまたは TaskFactory を使用できます。

特に、このタスクを簡単にするために、MVVM 用の小さなフレームワーク ヘルパーを維持しています。

  1. DTO、単一またはリストの取得
  2. カスタムマッパーを使用してViewModelに変換します(AutoMapperも)
  3. [オプション] リストを並べ替える
  4. [オプション] 完了後にメソッドを実行する

構成の変更をテストする目的で、単一のスレッドですべてを実行することも可能です

ソース コード (リアルタイム更新ではない) はhttp://hyperionsdk.codeplex.comにあり、パッケージはhttp://nuget.org/packages/EyeSoft.Wpf.Facilitiesにあります。

使用例:

public ViewModelSorted(ServiceFactory<ICustomerService> customerServiceFactory)
{
    customerServiceFactory
        .Collection(this, x => CustomerCollection)
        .Sort(x => x.LastName)
        .Fill(x => x.GetCustomersWithTurnoverGreatherThan(0));
}
于 2013-01-30T20:50:30.213 に答える