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? :)