遇到一个挺典型的场景:在 ASP.NET Core 中,动态生成的 API 接口(比如那些继承了 IApplicationService 后自动转换为接口的 Service)在 Swagger 里调用原生 Controller 没问题,但一旦走动态接口,就报 LazyServiceProvider 为 null 的错误。容器用的是 Autofac,所有服务也都注册了,可属性注入偏偏不生效——这问题其实就卡在控制器实例的创建方式上。

先看一眼抽象类 ApplicationService 的代码:它继承了 IApplicationServiceIDynamicApi,并且通过 [Autowired] 标注了 LazyServiceProvider 属性,意图用属性注入来实现懒加载。下面的 ObjectMapperCurrentUserPermissionChecker 也都通过 LazyServiceProvider 来获取,逻辑上没问题。

Asp.Net动态接口中属性注入未生效的问题解决

问题出在哪儿呢?

关键在于 ASP.NET Core 默认的控制器实例化方式。如果不做特殊配置,MVC 框架会直接用 ActivatorUtilities.CreateInstance 来创建控制器,这种方式只支持构造函数注入,根本不认属性注入(比如 [Autowired])。而 Autofac 等第三方容器的属性注入、拦截器等高级功能,只有在控制器实例由 DI 容器创建时才会生效。

解决方法其实就一行配置:

builder.Services.AddControllers()
    .AddControllersAsServices(); // 这很重要,确保控制器由DI容器解析

Asp.Net动态接口中属性注入未生效的问题解决

AddControllersAsServices() 的作用很直接:

这样一来,Autofac 就能接管控制器的创建过程,属性注入自然也就生效了。

加与不加的区别

不加 AddControllersAsServices()

加 AddControllersAsServices()

一句话总结:如果你在动态接口中用了属性注入,并且容器是 Autofac,那 AddControllersAsServices() 就是必须的。少了这一行,属性注入就不会执行,LazyServiceProvider 自然是 null。

本文转载于:https://www.jb51.net/aspnet/344427frl.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。