最近我正在浏览一些旧代码并找到以下代码
public class ProfileModule : IModule
{
private readonly IRegionManager regionManager;
private readonly IUnityContainer container;
private IEventAggregator eventAggregator;
public ProfileModule(IUnityContainer c, IRegionManager r, IEventAggregator e)
{
container = c;
regionManager = r;
eventAggregator = e;
}
public void Initialize()
{
// Create and add profiles as new Tab items
container.RegisterType<IProfileViewModel, Profile1ViewModel>(new ContainerControlledLifetimeManager());
regionManager.Regions[RegionNames.HomeRegion].Add(container.Resolve<ProfileView>());// HomeRegion is of type TabControl
container.RegisterType<IProfileViewModel, Profile2ViewModel>(new ContainerControlledLifetimeManager());
regionManager.Regions[RegionNames.HomeRegion].Add(container.Resolve<ProfileView>());
container.RegisterType<IProfileViewModel, Profile3ViewModel>(new ContainerControlledLifetimeManager());
regionManager.Regions[RegionNames.HomeRegion].Add(container.Resolve<ProfileView>());
}
}
以下是ProfileView.xaml.cs
public partial class ProfileView : INotifyPropertyChanged
{
[InjectionConstructor]
public ProfileView(IProfileViewModel vm)
{
DataContext = vm;
InitializeComponent();
}
}
以下是viewModels
public abstract class ProfileViewModelBase : IProfileViewModel, IDataErrorInfo, INotifyPropertyChanged
{
public ProfileViewModelBase(IEventAggregator eventAggregator, IRegionManager regionManager)
{
}
}
public class Profile1ViewModel : ProfileViewModelBase
{
[InjectionConstructor]
public Profile1ViewModel(IEventAggregator eventAggregator, IRegionManager regionManager)
: base (eventAggregator, regionManager)
{
}
}
public class Profile2ViewModel : ProfileViewModelBase
{
[InjectionConstructor]
public Profile2ViewModel(IEventAggregator eventAggregator, IRegionManager regionManager)
: base (eventAggregator, regionManager)
{
}
}
public class Profile3ViewModel : ProfileViewModelBase
{
[InjectionConstructor]
public Profile3ViewModel(IEventAggregator eventAggregator, IRegionManager regionManager)
: base (eventAggregator, regionManager)
{
}
}
我不清楚的部分代码是ProfileModule.Initialise()。 每次区域管理器添加视图时,都会创建一个新的ProfileView实例,而viewModel是最后注册的实例。
第一次使用Profile1ViewModel创建ProfileView作为Datacontext。 第二次使用Profile2ViewModel创建ProfileView作为Datacontext。 第三次使用Profile3ViewModel创建ProfileView作为Datacontext。
任何人都可以解释发生了什么吗?
答案 0 :(得分:0)
这里是:
您在Initialize
方法中可以看到的是,在注册IProfileViewModel
之后,代码会立即调用Resolve<ProfileView>
,而Resolve
正在提供Profile1ViewModel
到ProfileView
构造函数。然后第二个Register
替换第一次注册Profile2ViewModel。因此,对Resolve
的后续调用永远不会为您提供Profile1ViewModel
的实例(或单例实例)。
如果由于某种原因你真的想要解析ProfileView
的同一个实例,那么你需要将Register
这个与Unity容器一样作为单身,如下所示。
container.RegisterType(new ContainerControlledLifetimeManager());
这显然假设您定义了名为interface
IProfileView