2011-08-31 16 views
5

Actualmente estoy comenzando con el desarrollo de una nueva aplicación WPF donde uso Unity como contenedor DI. A partir de ahora, que estoy haciendo DI como este en los App.xaml.csCómo hacer Hollywood Principio + DI + WPF + Unidad

protected override void OnStartup(StartupEventArgs e) 
    { 
     var container = new UnityContainer(); 
     UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); 
     container = (UnityContainer)section.Configure(container); 
     WPFUnityContainer.Instance = container; 

     var mainwindow = new MainWindow(); 
     var mainmodel = container.Resolve<ViewModel.MainWindowViewModel>(); 
     mainwindow.DataContext = mainmodel; 
     mainwindow.Show(); 

     base.OnStartup(e); 
    } 

ctr de la MainWindowViewModel se ve así:

public MainWindowViewModel(IUserRepository userRepository, IGroupRepository groupRepository) 
    { 
     this._ManagementWorkSpaces = new ObservableCollection<WorkspaceViewModel>(); 
     this._ManagementWorkSpaces.Add(new ManageApplicationsViewModel()); 
     this._ManagementWorkSpaces.Add(new ManageUserViewModel(userRepository, groupRepository)); 

    } 

Ahora vamos a echar un vistazo a la ManageUserViewModel:

public ManageUserViewModel(IUserRepository userRepository, IGroupRepository groupRepository) 

    {... 
     this._ManageGroupsCommand = new DelegateCommand(() => 
     { 
      LookupGroupDialogViewModel vm=new LookupGroupDialogViewModel(groupRepository); 
      View.LookupGroupDialogWindow vw=new View.LookupGroupDialogWindow(); 
      ModalDialogService.Service.ShowDialog(vw, vm, returnedVM => 
       { 
        if (returnedVM.SelectedGroup!=null) 
         this.SelectedUser.Groups.Add(returnedVM.SelectedGroup); 
       }); 
     }); 

    } 

Como puede ver, estoy inyectando el groupRepository solo para pasarlo al LookUpGroupDialogViewModel. Podría dejar el IGroupRepository fuera del ctr de ManageUserViewModel y resolverlo directamente a través del contenedor, pero creo que eso viola el principio de hollywood. ¿Cómo puedo, en WPF, resolver todas mis dependencias para que el contenedor me llame? :)

Respuesta

5

Me parece que si los modelos de vista que está agregando al _ManagementWorkSpaces deben tener algún tipo de abstracción común (a menos que la colección esté completamente sin tipo y simplemente acepte cualquier object) - Supongo que este es el WorkspaceViewModel tipo.

Esto significa que se puede resolver perfectamente el problema cambiando el constructor para tener este aspecto:

public MainWindowViewModel(ObservableCollection<WorkspaceViewModel> workSpaces) 
{ 
    this._ManagementWorkSpaces = workSpaces; 
} 

Vamos Composition Root su preocupación acerca de cómo se resuelva la instancia ObservableCollection<WorkspaceViewModel>.