c# - Autofac 错误地解析命名服务

标签 c# asp.net dependency-injection autofac

我正在使用 AutoFac 进行依赖注入(inject),并且在 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);

其中 _codeMapperFactory 实现了 ICodeMapper 并且是上面注册的 4 个映射器的基础抽象类。

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

当我调试时,被调用的构造函数属于 RelationshipMapper,无论传递给工厂的参数值是什么。

这可能是什么原因?

最佳答案

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

所以。

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

// 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();

这是我要检查的内容:

  • 确保您可以手动解析您的命名映射器,以确保其正常工作。
  • 确保您正在解析 Antlr Func而不是 System.Func .
  • 尝试删除 As<ICodeMapper>并且只使用 Named<ICodeMapper>如果您不解析任何未命名的类型。您可能会开始遇到异常,这可能有助于您进一步排除故障。就像 Autofac 抛出关于 no ICodeMapper 的异常一样注册后,您会知道它不是在解决已命名 的问题,而是在尝试解决未命名 的问题。
  • 从你的 Antlr 中抛出异常 Func而不是调用 componentContext.ResolveNamed .看看它是否真的被击中了。 (我在那些从函数生成的函数中设置断点时运气不好。您也可以在其中尝试断点。)

希望对您有所帮助。

关于c# - Autofac 错误地解析命名服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53759578/

相关文章:

android - dagger hilt android中的ActivityRetainedComponent @ActivityRetainedScope和ActivityComponent @ActivityScoped有什么区别

c# - 如何使用 MVVM 将 UserControl 从插件传递到我的主窗口?

C# P/Invoke结构问题

javascript - 在客户端设置显示没有任何 asp 面板在任何 linkBut​​tonclick 上重新显示它

javascript - ASP.Net 从表中动态创建的行获取信息

spring - Spring注解@Autowired如何工作?

c# - WPF 中的便笺项目。模型、 View 、 View 模型

c# - 在自定义 JsonValidator 中访问字段父级

asp.net - 无法确定 GridView 中复选框的状态

asp.net-mvc - 使用 IoC,Singleton 可以注入(inject)具有 transient 生命周期的对象吗?