ASP.NET Webforms下Autofac类库属性依赖注入失效原因求解
问题解答
预期正确性判断
你对Autofac.Web自动注入属性的预期是不正确的。Autofac默认仅对两类场景的对象自动启用属性注入:
- 由Autofac直接通过
Resolve()等方法主动创建、生命周期完全由容器接管的对象 - ASP.NET WebForms场景下,Autofac.Web默认仅对Page页面、UserControl用户控件、HttpModule等WebForms原生宿主对象启用属性注入,不会自动对这些宿主对象的依赖项再递归执行属性注入逻辑
两种注入方式差异的原因
构造函数注入正常的原因
Autofac对所有已注册的服务默认启用构造函数注入逻辑:只要你完成了IAnother对应实现的注册,当Autofac创建ISomething实现类的实例时,会自动识别构造函数的入参依赖,从容器中匹配到对应实例传入。不管ISomething是被哪个对象依赖,只要它的实例是Autofac创建的,构造函数依赖都会被正确填充。
属性注入失败的原因
Autofac的属性注入属于非默认启用的能力,需要显式配置才会生效:
- 你在注册ISomething实现类的时候没有显式调用
PropertiesAutowired()方法,Autofac不会主动扫描并填充该类的公共属性依赖 - 虽然WebForm页面对象的ISomething属性因为Autofac.Web对宿主的特殊处理被自动注入了,但是ISomething实例本身是Autofac按照默认规则创建的,默认不会处理它自身的属性依赖,所以IAnother始终为null
可选修复方案(若要保留属性注入实现)
注册ISomething时显式开启属性注入配置即可:
builder.RegisterType<SomethingImpl>().As<ISomething>().PropertiesAutowired();
内容的提问来源于stack exchange,提问作者JosephS
相关产品推荐
相关产品推荐

