Unity容器如何解析已注册的类型

时间:2017-03-01 14:38:30

标签: wpf mvvm prism

最近我正在浏览一些旧代码并找到以下代码

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。

  1. 容器如何确切地知道在创建视图时要创建哪个视图模型。
  2. 我也理解,如果视图已经有了,则返回视图将返回视图,第一次创建并返回视图,第二次返回相同视图,但会创建一个新视图。与第三名相同。
  3. 任何人都可以解释发生了什么吗?

1 个答案:

答案 0 :(得分:0)

这里是:

  1. 您在Initialize方法中可以看到的是,在注册IProfileViewModel之后,代码会立即调用Resolve<ProfileView>,而Resolve正在提供Profile1ViewModelProfileView构造函数。然后第二个Register 替换第一次注册Profile2ViewModel。因此,对Resolve的后续调用永远不会为您提供Profile1ViewModel的实例(或单例实例)。

  2. 如果由于某种原因你真的想要解析ProfileView的同一个实例,那么你需要将Register这个与Unity容器一样作为单身,如下所示。

    container.RegisterType(new ContainerControlledLifetimeManager());

  3. 这显然假设您定义了名为interface

    IProfileView