You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何带KeyFilter参数的MyService解析失败,而IService可正常解析?

问题原因分析

这个问题的核心在于你的MyService注册配置不完整,导致解析具体类型时属性过滤没有生效。

让我拆解一下细节:

  • 你已经注册了带KeyFilter("sampleone")标识的CustomRepo作为IRepository的键控服务,这部分是没问题的。
  • MyService的构造函数依赖这个特定的键控IRepository,而要让Autofac识别构造函数上的[KeyFilter]属性,必须通过WithAttributeFiltering()来启用属性过滤逻辑。

从你给出的注册代码来看:

builder.RegisterType<MyService>().AsSelf().WithAttributeFiltering();

但你提到能正常解析IService类型,这说明你肯定还有另一个MyService的注册(比如额外加了As<IService>()),而且那个注册是带有WithAttributeFiltering()的——所以解析接口时属性过滤生效,能找到对应的键控仓储。但当你解析具体类型MyService时,容器使用的是单独的AsSelf()注册(如果是分开注册的话),这时候属性过滤没有被启用,Autofac会尝试寻找默认的(非键控)IRepository实现,而你只注册了键控版本,自然找不到依赖,抛出解析异常。

解决方案

把MyService的注册合并成一个,同时注册为自身和接口,统一启用属性过滤:

builder.RegisterType<MyService>()
       .AsSelf()
       .As<IService>()
       .WithAttributeFiltering();

这样不管你解析IService接口还是MyService具体类型,容器都会使用同一个注册配置,自动识别构造函数上的[KeyFilter]属性,正确解析对应的键控IRepository。

另外提一句:你控制器里的ILifteTimeScope拼写有误,应该是ILifetimeScope——不过你说解析testone正常,应该只是输入时的笔误,实际代码没问题。

内容的提问来源于stack exchange,提问作者SamIAm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:33:27