gpt4 book ai didi

c# - IoC Container Unity 搞砸了我

转载 作者:行者123 更新时间:2023-11-30 21:16:34 31 4
gpt4 key购买 nike

有可能我不理解它应该如何工作。

在我启动我的应用程序的地方,我这样做:

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 中订阅了一个事件。 Unity 应在此处解析 WorkspaceFactory 和 WindowManager,以便创建它们的实例。

这是 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 永远不会收到通知,实际上 Changed 事件是空的,就像这是 IWindowManager 的一个单独实例。

怎么可能?

我完全不对吗?我的印象是,如果您不为容器中的类型定义 LifeTime,您总是会得到相同的实例。

最佳答案

抱歉,但我认为你不对 - 如果 Unity 类似于 AutoFac,那么默认行为将是“每个请求的新实例”。

这确实是文档中的样子“每次都会创建已注册、映射或请求类型的新实例”- 参见 http://msdn.microsoft.com/en-us/library/cc440953.aspx

要更正此问题,请在注册类型时提供一个 LifetimeManager - 例如ContainerControlledLifetimeManager(参见 http://msdn.microsoft.com/en-us/library/cc440953.aspx)

关于c# - IoC Container Unity 搞砸了我,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5135110/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com