Autofac在ASP.NET Web API中构造注入正常但属性注入失效求助
以下是针对问题的具体排查点:
确认目标类实例是否由Autofac容器管理
Autofac仅对自身创建的实例执行属性注入。若目标类是通过new()直接实例化的,容器完全感知不到该实例,自然不会注入依赖。可在new实例后手动调用container.InjectProperties(yourInstance)测试,若依赖能正常注入,说明问题根源就是实例未被容器托管。排查Autofac模块的注册冲突或覆盖
多子项目模块场景下,可能存在多个模块对同一类的注册。如果某个仅包含基础注册(如RegisterType<YourClass>())的模块,覆盖了带属性注入配置的注册(如带OnActivated或PropertiesAutowired的注册),最终生效的注册会丢失属性注入逻辑。需检查所有模块中目标类的注册代码,确保最终生效的注册包含属性注入配置。验证属性注入配置的正确性
- 检查注册时填写的属性名称与目标类的属性名是否完全匹配(大小写敏感);
- 若使用
PropertiesAutowired(),确认目标类的属性是公共可写属性(具备public set;); - 若使用
OnActivated回调,确认回调逻辑中正确获取依赖并赋值给目标属性,无拼写错误或类型不匹配问题。
检查Web API与Autofac的集成配置
虽然构造注入正常,但需确认Web API的DependencyResolver已正确设置为Autofac的Resolver。若目标类是ApiController子类,还需确认Controller的注册是否启用了属性注入(如builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired())。排查容器作用域问题
若目标类实例在子作用域中创建,需确认子作用域能正确解析到依赖。同时检查依赖的生命周期配置,比如依赖注册为单例但子作用域无法访问的极端情况。验证依赖的注册状态
确认依赖接口(如IMyDependency)已正确注册到容器中,且注册类型与目标属性类型匹配。可在代码中尝试手动container.Resolve<IMyDependency>(),若抛出异常说明依赖未正确注册,这会导致属性注入时赋值为null。
附Demo代码
using Autofac; public class Program { public static void Main() { var builder = new ContainerBuilder(); builder.RegisterType<MyDependency>().As<IMyDependency>().SingleInstance(); builder.RegisterType<MyService>().OnActivated(e => e.Instance.MyDependency1 = e.Context.Resolve<IMyDependency>()); //builder.Register(c => new MyService { MyDependency1 = c.Resolve<IMyDependency>() }); //builder.RegisterType<MyService>().WithProperty("MyDependency1", new MyDependency()).SingleInstance(); var container = builder.Build(); container.Resolve<MyService>(); } } public class MyService { public IMyDependency MyDependency1 { get; set; } } public class MyDependency : IMyDependency { public void Hello() { Console.WriteLine("Hello from MyDependency1"); } public MyDependency() { Hello(); } } public interface IMyDependency { public void Hello(); }
内容的提问来源于stack exchange,提问作者user2461440

