Autofac 错误地解析命名服务

我正在使用 AutoFac 进行依赖注入,并且global.asax文件中有以下代码。


builder.RegisterType<GenderMapper>()

    .As<ICodeMapper>().Named<ICodeMapper>(ValueSets.Gender.ToString());


builder.RegisterType<LanguageMapper>()

    .As<ICodeMapper>().Named<ICodeMapper>(ValueSets.Language.ToString());


builder.RegisterType<MaritalStatusMapper>()

    .As<ICodeMapper>().Named<ICodeMapper>(ValueSets.MaritalStatus.ToString());


builder.RegisterType<RelationshipMapper>()

    .As<ICodeMapper>().Named<ICodeMapper>(ValueSets.Relationship.ToString());


builder.Register<Antlr.Runtime.Misc.Func<string, ICodeMapper>>(c =>

{

    var componentContext = c.Resolve<IComponentContext>();

    return (roleName) =>

    {

        var codeMapper = componentContext.ResolveNamed<ICodeMapper>(roleName);

        return codeMapper;

    };

});

ValueSets枚举在哪里。我这样解决服务:


var codeMapper = _codeMapperFactory(mapperInstanceName);

where_codeMapperFactory实现ICodeMapper并且是上面注册的 4 个映射器的基本抽象类。


问题是,无论 be 的值是什么mapperInstanceName,我总是让映射器最后注册(即。RelationshipMapper)。


当我调试时,被调用的构造函数是RelationshipMapper传递给工厂的参数的值。


这可能是什么原因?


隔江千里
浏览 114回答 1
1回答

精慕HU

这里有很多东西要解开,可能需要一些来回的讨论,因为没有足够的信息,但我的时间有点短,想给你一个答案来帮助你。我可能会也可能不会回到这里,所以如果我的回答不起作用,最好用其他信息更新你的问题,而不是发表评论并坐下来等我。所以。我看到您已将映射器注册为. 我还看到这是最后一个,这意味着如果您解决了一个未命名的实现,那就是您会得到的。ICodeMapperRelationshipMapper// You'd get RelationshipMappercontainer.Resolve<ICodeMapper>();我也看到有一个Antlr.Runtime.Misc.Func<string, ICodeMapper>正在注册的。我不知道那种类型是什么,但我可以看到它与System.Func<string, ICodeMapper>.Autofac 处理System.Func,所以如果它被调用,你会得到一个未命名的实例。// You'd get RelationshipMappervar f = container.Resolve<Func<ICodeMapper>>();f();这是我要检查的内容:确保您可以手动解析命名映射器,以确保其正常工作。确保您正在解析 AntlrFunc而不是System.Func.尝试删除As<ICodeMapper>并且仅Named<ICodeMapper>在您不解析任何未命名类型时才使用。您可能会开始遇到异常,这可能会帮助您进一步排除故障。就像如果 Autofac 抛出一个关于没有被注册的异常ICodeMapper,你就会知道它不是在解析命名的东西,它是在尝试解析未命名的东西。从 Antlr 中抛出异常,Func而不是调用componentContext.ResolveNamed.&nbsp;看看它是否真的被击中。(我运气不好在那些生成的函数中设置断点。你也可以在那里尝试一个断点。)希望有帮助。
打开App,查看更多内容
随时随地看视频慕课网APP