代码之家  ›  专栏  ›  技术社区  ›  Ben Gribaudo

满足子视图模型依赖性

  •  4
  • Ben Gribaudo  · 技术社区  · 14 年前

    我正在构建一个主细节表单。主视图模型构造详细视图模型的实例。这些详细信息视图模型具有几个需要满足的依赖项 新的 类实例。(这是因为它们需要在独立于主虚拟机的数据上下文中操作的服务层。)

    实现这些依赖性的最佳方法是什么?

    谢谢您,

    3 回复  |  直到 14 年前
        1
  •  1
  •   jbe    14 年前

    这个 书库 样品应用 WPF Application Framework (WAF) 演示如何使用m-v-v m实现主/细节场景。它使用MEF作为IOC容器来满足视图模型依赖性。

        2
  •  0
  •   David Lynch    14 年前

    您还可以使用容器构造详细视图:

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

    容器将解析IAccountService和ITransactionService的依赖关系。但是你仍然依赖于国际奥委会的框架(除非你使用 CommonServiceLocator )

    下面是我如何使用CommonServiceLocator:

    this.accountService = ServiceLocator.Current.GetInstance<IAccountService>();
    this.transactionService = ServiceLocator.Current.GetInstancey<ITransactionService>();
    
        3
  •  0
  •   Ben Gribaudo    14 年前

    一些可能性:

    硬编码引用

    下面的方法可以解决这个问题。但是,由于它引入了硬编码依赖项,因此使用它是不可能的。

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

    通过国际奥委会框架的决议

    另一种选择是父视图模型保存对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());
        }
        // ....