最近我通过一些旧代码去,发现下面的代码如何统一容器将解决注册类型
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。
- 容器如何确切地知道在创建视图时要创建哪个视图模型。
- 另外我明白,container.Resolve将返回视图,如果它已经有一个,第一次视图被创建并返回,第二次我除了相同的视图将被返回,但一个新的视图被创建。与第三个相同。
任何人都可以解释发生了什么?
的代码格式不显示 – Bijington
谢谢Bijington一些很奇怪的原因。这回答我。 – JSR
如果我们再次注册,我绝不会进行替换。在'Initilaise()'中,代码只是'regionManager.Regions [RegionNames.HomeRegion] .Add(new profileView(new profile1ViewModel()); regionManager.Regions [RegionNames.HomeRegion] .Add(new profileView(new profile2ViewModel() ); regionManager.Regions [RegionNames.HomeRegion] .Add(new profileView(new profile3ViewModel());'作为'container'将不会有任何对视图的引用并失去对viewModels的引用。 – JSR