저는 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에서 모든 종속성을 어떻게 해결할 수 있습니까? :)