为何带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
相关产品推荐
相关产品推荐

