Удовлетворение зависимостей модели представления о ребенке - PullRequest
4 голосов
/ 28 июля 2010

Я строю форму мастер-детали.Модель основного вида создает экземпляры модели подробного представления.У этих моделей подробного просмотра есть несколько зависимостей, которые должны быть удовлетворены с новыми экземплярами класса.(Это потому, что им нужны сервисные уровни, которые работают в отдельном контексте данных от master vm.)

Каков наилучший способ выполнения этих зависимостей?

Спасибо,
Бен

Ответы [ 3 ]

1 голос
/ 29 июля 2010

Пример приложения BookLibrary из WPF Application Framework (WAF) показывает, как реализовать сценарий Master / Detail с M-V-VM. Он использует MEF в качестве контейнера IoC для удовлетворения зависимостей ViewModel.

0 голосов
/ 26 августа 2010

Некоторые возможности:

Жесткие ссылки

Следующий подход решит проблему. Однако, поскольку он вводит жестко запрограммированные зависимости, об его использовании не может быть и речи.

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

Разрешение через IoC Framework

Другим вариантом было бы, чтобы модель родительского представления содержала ссылку на структуру IoC. Этот подход вводит зависимость модели основного вида от фрейма IoC.

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

Factory Func <> s

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());
    }
    // ....
0 голосов
/ 28 июля 2010

Вы также можете использовать контейнер для построения подробного вида:

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

Контейнер разрешит зависимости для IAccountService и ITransactionService. Но вы все равно будете зависеть от инфраструктуры IOC (если вы не используете CommonServiceLocator ).

Вот как я это делаю, используя CommonServiceLocator:

this.accountService = ServiceLocator.Current.GetInstance<IAccountService>();
this.transactionService = ServiceLocator.Current.GetInstancey<ITransactionService>();
...