4

マスター/詳細フォームを作成しています。マスター ビュー モデルは、詳細ビュー モデルのインスタンスを構築します。これらの詳細ビュー モデルには、新しいクラス インスタンスで満たす必要があるいくつかの依存関係があります。(これは、マスター VM とは別のデータ コンテキストで動作するサービス レイヤーが必要なためです。)

これらの依存関係を満たす最善の方法は何でしょうか?

ありがとう、
ベン

4

3 に答える 3

1

WPFアプリケーションフレームワーク(WAF)BookLibraryサンプルアプリケーションは、MV-VMを使用してマスター/詳細シナリオを実装する方法を示しています。MEFをIoCコンテナとして使用して、ViewModelの依存関係を満たします。

于 2010-07-29T18:07:49.693 に答える
0

いくつかの可能性:

ハードコーディングされた参照

次のアプローチは、問題を解決します。ただし、ハードコーディングされた依存関係が導入されるため、それを使用することは問題外です。

// in the master view model
var detailViewModel = new DetailViewModel(new AccountService(), new TransactionService());

IOC フレームワークによる解決

もう 1 つのオプションは、親ビュー モデルが IoC フレームワークへの参照を保持することです。このアプローチにより、IoC フレームワークに対するマスター ビュー モデルの依存関係が導入されます。

// in the master view model
var detailViewModel = new DetailViewModel(resolver.GetNew<IAccountService>(), resolver.GetNew<IAccountService>());

工場関数<>

class MasterViewModel {
  public MasterViewModel(Func<Service.IAccountService> accountServiceFactory, Func<Service.ITransactionService> transactionServiceFactory) {
    this.accountServiceFactory = accountServiceFactory;
    this.transactionServiceFactory = transactionServiceFactory;

    // instances for MasterViewModel's internal use
    this.accountService = this.accountServiceFactory();
    this.transactionService = this.transactionServiceFactory():
  }
  public SelectedItem { 
    set {
       selectedItem = value;
       DetailToEdit = new DetailViewModel(selectedItem.Id, accountServiceFactory(), transactionServiceFactory());
    }
    // ....
于 2010-08-26T12:46:00.927 に答える
0

コンテナーを使用して詳細ビューを作成することもできます。

var detailViewModel = container.CreateInstance<DetailViewModel>();

コンテナーは、IAccountService と ITransactionService の依存関係を解決します。ただし、 IOC フレームワークには引き続き依存します ( CommonServiceLocatorを使用しない限り)。

CommonServiceLocator を使用して行う方法は次のとおりです。

this.accountService = ServiceLocator.Current.GetInstance<IAccountService>();
this.transactionService = ServiceLocator.Current.GetInstancey<ITransactionService>();
于 2010-07-28T00:07:49.170 に答える