我正在使用 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 抛出关于 noICodeMapper
的异常一样注册后,您会知道它不是在解决已命名 的问题,而是在尝试解决未命名 的问题。 - 从你的 Antlr 中抛出异常
Func
而不是调用componentContext.ResolveNamed
.看看它是否真的被击中了。 (我在那些从函数生成的函数中设置断点时运气不好。您也可以在其中尝试断点。)
希望对您有所帮助。
关于c# - Autofac 错误地解析命名服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53759578/