マスター/詳細フォームを作成しています。マスター ビュー モデルは、詳細ビュー モデルのインスタンスを構築します。これらの詳細ビュー モデルには、新しいクラス インスタンスで満たす必要があるいくつかの依存関係があります。(これは、マスター VM とは別のデータ コンテキストで動作するサービス レイヤーが必要なためです。)
これらの依存関係を満たす最善の方法は何でしょうか?
ありがとう、
ベン
マスター/詳細フォームを作成しています。マスター ビュー モデルは、詳細ビュー モデルのインスタンスを構築します。これらの詳細ビュー モデルには、新しいクラス インスタンスで満たす必要があるいくつかの依存関係があります。(これは、マスター VM とは別のデータ コンテキストで動作するサービス レイヤーが必要なためです。)
これらの依存関係を満たす最善の方法は何でしょうか?
ありがとう、
ベン
WPFアプリケーションフレームワーク(WAF)のBookLibraryサンプルアプリケーションは、MV-VMを使用してマスター/詳細シナリオを実装する方法を示しています。MEFをIoCコンテナとして使用して、ViewModelの依存関係を満たします。
次のアプローチは、問題を解決します。ただし、ハードコーディングされた依存関係が導入されるため、それを使用することは問題外です。
// in the master view model
var detailViewModel = new DetailViewModel(new AccountService(), new TransactionService());
もう 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());
}
// ....
コンテナーを使用して詳細ビューを作成することもできます。
var detailViewModel = container.CreateInstance<DetailViewModel>();
コンテナーは、IAccountService と ITransactionService の依存関係を解決します。ただし、 IOC フレームワークには引き続き依存します ( CommonServiceLocatorを使用しない限り)。
CommonServiceLocator を使用して行う方法は次のとおりです。
this.accountService = ServiceLocator.Current.GetInstance<IAccountService>();
this.transactionService = ServiceLocator.Current.GetInstancey<ITransactionService>();