【发布时间】:2011-02-27 18:47:19
【问题描述】:
我可能不明白它应该如何工作。
我从哪里开始我的应用程序:
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();
}
}
当我将原始容器注册为实例时,它应该是传入工厂的内容。所以我让同一个 Container 解析将 IWindowsManager 作为 ctro 参数的工作区。所以它应该得到 sama 实例,因为 MainWindowViewModel 是正确的?
但如果我从工作区内部触发事件,MainView 永远不会收到通知,实际上 Changed 事件是空的,就像这是 IWindowManager 的单独实例。
怎么可能?
我是不是完全走神了,我的印象是,如果你不为容器中的类型定义 LifeTime,你总是会得到相同的实例。
【问题讨论】:
标签: c# events event-handling ioc-container resolve