为了账号安全,请及时绑定邮箱和手机立即绑定

Autofac 错误地解析命名服务

Autofac 错误地解析命名服务

C#
隔江千里 2022-06-12 11:13:21
我正在使用 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传递给工厂的参数的值。这可能是什么原因?
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

这里有很多东西要解开,可能需要一些来回的讨论,因为没有足够的信息,但我的时间有点短,想给你一个答案来帮助你。我可能会也可能不会回到这里,所以如果我的回答不起作用,最好用其他信息更新你的问题,而不是发表评论并坐下来等我。


所以。


我看到您已将映射器注册为. 我还看到这是最后一个,这意味着如果您解决了一个未命名的实现,那就是您会得到的。ICodeMapperRelationshipMapper


// You'd get RelationshipMapper

container.Resolve<ICodeMapper>();

我也看到有一个Antlr.Runtime.Misc.Func<string, ICodeMapper>正在注册的。我不知道那种类型是什么,但我可以看到它与System.Func<string, ICodeMapper>.


Autofac 处理System.Func,所以如果它被调用,你会得到一个未命名的实例。


// You'd get RelationshipMapper

var f = container.Resolve<Func<ICodeMapper>>();

f();

这是我要检查的内容:

  • 确保您可以手动解析命名映射器,以确保其正常工作。

  • 确保您正在解析 AntlrFunc而不是System.Func.

  • 尝试删除As<ICodeMapper>并且仅Named<ICodeMapper>在您不解析任何未命名类型时才使用。您可能会开始遇到异常,这可能会帮助您进一步排除故障。就像如果 Autofac 抛出一个关于没有被注册的异常ICodeMapper,你就会知道它不是在解析命名的东西,它是在尝试解析未命名的东西。

  • 从 Antlr 中抛出异常,Func而不是调用componentContext.ResolveNamed. 看看它是否真的被击中。(我运气不好在那些生成的函数中设置断点。你也可以在那里尝试一个断点。)

希望有帮助。


查看完整回答
反对 回复 2022-06-12
  • 1 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信