我有一个授权Service【AuthService】继承抽象类【ApplicationService】,程序会后会将所有继承IApplicationService的Service动态转换为Api接口,在swagger使用原生Controller控制器接口调用AuthService是没有问题的,测试【AuthService】的动态接口报错【LazyServiceProvider为null】
容器注入选择的是:Autofac,所有服务均注册
抽象类代码如下:
其中LazyServiceProvider是通过属性注入来实现的
[Authorize] public abstract class ApplicationService : IApplicationService, IDynamicApi { ////// 懒加载服务驱动(属性注入) /// [Autowired] public ILazyServiceProvider LazyServiceProvider { get; set; } #region Private-Attribute private IMapper _ObjectMapper; private ICurrentUserService _CurrentUser; private IPermissionChecker _IPermissionChecker; #endregion Private-Attribute #region Protected-Attribute ////// AutoMap /// protected IMapper ObjectMapper { get { if (_ObjectMapper == null) { _ObjectMapper = LazyServiceProvider.LazyGetRequiredService(); } return _ObjectMapper; } } ////// 当前用户 /// protected ICurrentUserService CurrentUser { get { if (_CurrentUser == null) { _CurrentUser = LazyServiceProvider.LazyGetRequiredService(); } return _CurrentUser; } } ////// 权限检查 /// protected IPermissionChecker PermissionChecker { get { if (_IPermissionChecker == null) { _IPermissionChecker = LazyServiceProvider.LazyGetRequiredService(); } return _IPermissionChecker; } } #endregion Protected-Attribute }
解决方法:
在ASP.NET Core配置中:
builder.Services.AddControllers() .AddControllersAsServices(); // 这很重要,确保控制器由DI容器解析
AddControllersAsServices()
的主要作用是:
-
将控制器注册为服务:将所有控制器类注册到依赖注入(DI)容器中
-
使用DI容器解析控制器:确保控制器实例由DI容器创建,而不是由MVC框架直接实例化
加与不加的区别:
– 不加AddControllersAsServices()
-
控制器创建方式:
-
MVC框架会直接使用
ActivatorUtilities.CreateInstance
创建控制器实例 -
只支持构造函数注入,不支持属性注入
-
-
生命周期:
-
每个请求都会创建新的控制器实例
-
生命周期完全由MVC框架管理
-
-
限制:
-
无法使用Autofac等第三方容器的高级功能(如属性注入)
-
无法自定义控制器的解析过程
-
– 加AddControllersAsServices()
-
控制器创建方式:
-
控制器实例由DI容器创建
-
支持完整的DI功能,包括构造函数注入和属性注入
-
-
优势:
-
可以使用第三方容器(如Autofac)的所有功能
-
支持属性注入
-
可以自定义控制器的生命周期
-
可以在控制器解析前后执行自定义逻辑
-
-
生命周期:
-
默认仍然是每个请求创建新实例(Transient)
-
但可以通过注册时指定来改变生命周期
-
到此这篇关于Asp.Net 动态接口中属性注入未生效的文章就介绍到这了,更多相关Asp.Net 属性注入未生效内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!