首页 > 解决方案 > 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传递给工厂的参数的值。

这可能是什么原因?

标签: c#asp.netdependency-injectionautofac

解决方案


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

所以。

我看到您已将映射器注册. 我还看到这是最后一个,这意味着如果您解决了一个未命名的实现,那就是您会得到的。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. 看看它是否真的被击中。(我运气不好在那些生成的函数中设置断点。你也可以在那里尝试一个断点。)

希望有帮助。


推荐阅读