Prism - Unity - 无法在ConfigureRegionAdapterMappings中解析IRegionBehaviorFactory

时间:2018-01-20 15:18:14

标签: c# wpf unity-container prism

我是Prism的新手,我有一个应用程序,我需要有一个自定义区域映射。

当我尝试使用ServiceLocator解析IRegionBehaviorFactory时,我收到错误:

  

尝试获取IRegionBehaviorFactory类型的实例时出现激活错误,键“”

据我所知,这是因为RegionBehaviorFactory类接收Microsoft.Practices.Unity.IServiceLocator,但是使用Unity 7.0我用作ServiceLocator Unity.ServiceLocation.UnityServiceLocator

我该怎么办? 这是我的bootstrapper.cs

 class Bootstrapper : UnityBootstrapper
{
    private UnityContainer uc = new UnityContainer();

    protected override void ConfigureServiceLocator()
    {
        base.ConfigureServiceLocator();

        UnityServiceLocator locator = new UnityServiceLocator(uc);

        ServiceLocator.SetLocatorProvider(() => locator);
    }


    protected override DependencyObject CreateShell()
    {
        return ServiceLocator.Current.GetInstance<wMain>();
    }

    protected override void InitializeShell()
    {
        Application.Current.MainWindow = (wMain)this.Shell;
        Application.Current.MainWindow.Show();
    }

    protected override IModuleCatalog CreateModuleCatalog()
    {
        return new ConfigurationModuleCatalog();
    }

    protected override void InitializeModules()
    {
        base.InitializeModules();
    }

    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();

        uc.RegisterType<IServiceLocator, UnityServiceLocator>();
        uc.RegisterType<IRegionBehaviorFactory,  RegionBehaviorFactory>();

        Application.Current.Resources.Add("IoC", uc);
    }

    protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
    {
        var mappings = base.ConfigureRegionAdapterMappings();

        var aa = ServiceLocator.Current.GetInstance<IRegionBehaviorFactory>();

        mappings.RegisterMapping(typeof(RadPaneGroup), new RadPaneGroupRegionAdapter(uc.Resolve<RegionBehaviorFactory>()));

        return mappings;
    }
}

由于

1 个答案:

答案 0 :(得分:1)

为什么要创建新的容器和服务定位器?那个班都错了。您不需要创建那些容器,并且已经为您创建了所有服务。这就是你使用UnityBootstrapper的原因。 ServiceLocator也已为您设置。

你应该通过这些样本来更好地理解hwo使用Prism:https://github.com/PrismLibrary/Prism-Samples-Wpf

另一点建议,不要像你一样使用ServiceLocator。这是不好的做法。坚持使用常见的DI模式,并使用注射器或通过解析容器中的物体来解析物体。