それがどのように機能するのか理解していない可能性があります。
アプリを起動する場所でこれを行います。
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)));
}
}
windowManagerでイベントをサブスクライブしていることに注意してください。WorkspaceFactoryとWindowManagerは、Unityによってここで解決され、それらのインスタンスが作成されるはずです。
IWorkspaceFactoryの実装は次のとおりです。
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を定義しないと、常に同じインスタンスを取得するという印象を受けました。