어떻게 작동하는지 이해할 수 없을 수도 있습니다. 내 응용 프로그램을 시작IoC Container Unity가 나를 괴롭 히고 있습니다.
내가 이렇게 여기
IUnityContainer container = new UnityContainer();
container.RegisterInstance<IUnityContainer>(container);
//MainWindow
container.RegisterType<Window, MainWindow>();
//Services
container.RegisterType<IWindowManager, WindowManager>();
//Workspaces
container.RegisterType<WorkspaceViewModel, CompanyWorkspace>("Company");
container.RegisterType<WorkspaceViewModel, DivisionWorkspace>("Division")
//More of this
container.RegisterType<IWorkspaceFactory, WorkspaceFactory>();
Window window = container.Resolve<Window>();
window.DataContext = container.Resolve<ViewModel.MainWindowViewModel>();
window.Show();
내 MainWindowViewModel가 해결됩니다하고하는 것은 생성자에게 나는 창 관리자의 이벤트에 가입
public MainWindowViewModel(IWorkspaceFactory workspaceFactory, IWindowManager windowManager)
{
_workspaceFactory = workspaceFactory;
_windowManager = windowManager;
_windowManager.Changed += new EventHandler(DialogChanged);
ControlPanel = new ListCommandsViewModel();
foreach (string s in _workspaceFactory.GetWorkspaceList())
{
ControlPanel.List.Add(new CommandViewModel(s, new RelayCommand<string>(OpenWorkspace)));
}
}
공지 사항입니다이다. WorkspaceFactory와 WindowManager는 유니티에 의해 여기에서 해석되어 인스턴스가 생성됩니다. 여기
는 IWorkspaceFactory의 implmentation입니다 :public class WorkspaceFactory : IWorkspaceFactory
{
private IUnityContainer _container;
public WorkspaceFactory(IUnityContainer container)
{
_container = container;
}
public ViewModel.WorkspaceViewModel GetWorkspace(string workspace)
{
return _container.Resolve<WorkspaceViewModel>(workspace);
}
public ICollection<string> GetWorkspaceList()
{
return _container.Registrations.Where(r => r.RegisteredType == typeof(WorkspaceViewModel)).Select(r => r.Name).ToList();
}
}
가 나는 공장에 전달되는 있어야 할 인스턴스로 원래의 용기를 등록한다. 그래서 동일한 컨테이너가 IWindowsManager를 ctro 매개 변수로 잡는 작업 영역을 해결하게합니다. 그래서 MainWindowViewModel이 올바른 것처럼 sama 인스턴스를 가져야합니다?
그러나 작업 영역 내부에서 이벤트를 실행하면 MainView는 알림을받지 못합니다. 실제로이 이벤트는 IWindowManager의 별도 인스턴스이므로 Changed 이벤트는 비어 있습니다.
어떻게 될 수 있습니까?
전 완전히 벗어났습니다. 컨테이너의 유형에 대해 LifeTime을 정의하지 않으면 알 수없는 것처럼 느껴질 것입니다.
그래, 나는 설명서를 잘못 읽었 음을 알았다. RegisterType에서 작동하는 것처럼 RegisterInstance 장을 읽었습니다. 그건 내 문제를 설명해 줄거야. –