c# - 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
传递给工厂的参数的值。
这可能是什么原因?
解决方案
这里有很多东西要解压,可能需要一些来回的讨论,因为没有足够的信息,但我的时间有点短,想给你一个答案来帮助你。我可能会也可能不会回到这里,所以如果我的回答不起作用,最好用其他信息更新你的问题,而不是发表评论并坐下来等我。
所以。
我看到您已将映射器注册为. 我还看到这是最后一个,这意味着如果您解决了一个未命名的实现,那就是您会得到的。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 抛出一个关于没有被注册的异常ICodeMapper
,你就会知道它不是在解析命名的东西,它是在尝试解析未命名的东西。 - 从 Antlr 中抛出异常,
Func
而不是调用componentContext.ResolveNamed
. 看看它是否真的被击中。(我运气不好在那些生成的函数中设置断点。你也可以在那里尝试一个断点。)
希望有帮助。
推荐阅读
- python - Python3.7.2 中的 asyncio.wait_for exec 函数错误
- python - tensorflow.python.framework.errors_impl.InternalError: Dst tensor is not initialized
- c# - 如何在 Xamarin.Forms 的 NavigationPage.SetTitleView 中调用 XAML 代码?
- html - HTML 页面上的表格使用的宽度比 div 大得多
- soapui - 如何将 JSON 选项卡设置为 SOAP UI Open Source 中响应的默认视图?
- arrays - ios swift4中的Paytm校验和不匹配
- api - Dialogflow api突然返回CORS错误
- c# - 为 Asp.net 项目集成 CkEditor 5
- matlab - 在matlab中从二进制图像中提取白色像素
- chatbot - 用于测试聊天机器人的 Botium Box 社区版