2011-08-31 17 views
5

मैं वर्तमान में एक नए डब्ल्यूपीएफ एप्लिकेशन के विकास के साथ शुरू कर रहा हूं जहां मैं एकता को डी कंटेनर के रूप में उपयोग करता हूं। अब के रूप में, मैं App.xaml.cs में इस तरह डि कर रहा हूँहॉलीवुड सिद्धांत + डी + डब्ल्यूपीएफ + यूनिटी

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 के सीटीआर इस तरह दिखता है:

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 करने पर पारित करने के लिए। मैं IUroupRepository को ManageUserViewModel के सीटीआर से बाहर छोड़ सकता हूं और इसे सीधे कंटेनर के माध्यम से हल कर सकता हूं लेकिन मुझे लगता है कि हॉलीवुड सिद्धांत का उल्लंघन करता है। मैं, डब्ल्यूपीएफ में, मेरी सभी निर्भरताओं को कैसे हल कर सकता हूं ताकि कंटेनर मुझे कॉल कर सके? :)

उत्तर

5

ऐसा लगता है कि आप _ManagementWorkSpaces में जो दृश्य मॉडल जोड़ रहे हैं, उनमें कुछ प्रकार का सामान्य अबास्ट्रक्शन होना चाहिए (जब तक कि संग्रह पूरी तरह से अनियंत्रित न हो और केवल object स्वीकार करता हो) - मुझे लगता है कि यह है WorkspaceViewModel प्रकार।

इसका मतलब यह है कि आप बड़े करीने से निर्माता बदलते इस तरह बनाकर अपनी समस्या को हल कर सकते हैं:

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

कैसे ObservableCollection<WorkspaceViewModel> उदाहरण हल हो गई है के बारे में अपने Composition Root चिंता करने दें।

संबंधित मुद्दे