代码之家  ›  专栏  ›  技术社区  ›  Edgar Ortiz

模块中的Prism RegisterTypeForNavigation()。Initialize()不工作

  •  0
  • Edgar Ortiz  · 技术社区  · 8 年前

    我正在将Prism 6.3.0与Autofac一起使用。

    当我在 Initialize() a的方法 IModule 这样地:

     public class TestModule : IModule
     {
        public TestModule (ContainerBuilder builder)
        {
            this.Builder = builder;
        }
    
        private ContainerBuilder Builder { get; set; }
    
        public void Initialize()
        {
            ...
            this.Builder.RegisterTypeForNavigation<ViewTest>();
        }
    }
    

    然后尝试从另一个模块导航,如下所示:

      private void NavigateTest()
            =>
                this.RegionManager.RequestNavigate("MainContentRegion", new Uri("ViewTest", UriKind.Relative), this.Result);
    
        private void Result(NavigationResult obj)
        { // Breakpoint here
        }
    

    它失败,并出现以下错误:

    尚未注册请求的服务“ViewTest(System.Object)”。为了避免此异常,请注册一个组件以提供服务,使用IsRegistered()检查服务注册,或者使用ResolveOptional()方法来解析可选依赖项。

    和StackTrace:

    en Autofac。分辨率扩展。ResolveService(IComponentContext上下文,服务服务,IEnumerable'1参数) en棱镜。自动传真。AutofacServiceLocatorAdapter。DoGetInstance(类型serviceType,字符串键) en微软。实践。服务位置。ServiceLocatorImplBase。GetInstance(类型serviceType,字符串键)en c:\Projects\CommonServiceLocator\main\Microsoft。实践。ServiceLocation\ServiceLocatorImplBase。cs:lnea 49

    但是如果我注册输入 ConfigureContainerBuilder(ContainerBuilder builder) ,它工作正常,我可以毫无问题地导航:

    protected override void ConfigureContainerBuilder(ContainerBuilder builder)
        {
            builder.RegisterTypeForNavigation<ViewTest >();
    
            base.ConfigureContainerBuilder(builder);
        }
    

    是否可以在模块的 初始化() 方法还是必须在 ConfigureContainerBuilder() ?

    1 回复  |  直到 8 年前
        1
  •  0
  •   user5420778 user5420778    8 年前

    Autofac不支持模块,因为它是一个不可变的容器。您传递的构建器不是引导程序正在使用的构建器,而是一个新实例。目前,您可以通过使用新的生成器更新容器来解决此问题,但Autofac已将更新方法标记为过时,并将其删除。由于这一变化,我不建议对需要模块的应用程序使用Autofac,因为在v7中,如果因此使用Autofac,Prism将不再允许加载模块。

    如果您对此有强烈的感觉,可以向Autofac项目发布一个问题,要求他们不要使容器不可变。

    推荐文章