2011-08-31 4 views
5

저는 Unity를 DI 컨테이너로 사용하는 새로운 WPF 응용 프로그램을 개발하고 있습니다. 지금, 나는이 App.xaml.cs를이 같은 DI를하고 있어요할리우드 원리 + DI + WPF + 유니티

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); 
    } 

MainWindowViewModel의 클릭률 (CTR)은 다음과 같습니다

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

    } 
이제

의이 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); 
       }); 
     }); 

    } 

위에서 볼 수 있듯이 groupRepository 만 주입하여 LookUpGroupDialogViewModel에 전달합니다. IGroupRepository를 ManageUserViewModel의 ctr 밖으로 가져와 컨테이너를 통해 직접 해결할 수는 있지만 할리우드 원칙을 위반한다고 생각합니다. 컨테이너에서 나를 호출하도록 WPF에서 모든 종속성을 어떻게 해결할 수 있습니까? :)

답변

5

_ManagementWorkSpaces에 추가 할보기 모델에 컬렉션이 완전히 형식이 지정되지 않고 단순히 object을 허용하지 않는 한 어떤 종류의 공통 추상화가 있어야하는 것처럼 보입니다. 저는 이것이 WorkspaceViewModel 유형.

이것은 당신이 깔끔하게과 같이 생성자를 변경하여 문제를 해결할 수 있다는 것을 의미한다 :

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

ObservableCollection<WorkspaceViewModel> 인스턴스가 해결 방법에 대해 Composition Root 걱정하자.