Asp.Net 动态接口中属性注入未生效的问题解决
作者:互联网
2025-08-25
目录
- - 不加AddControllersAsServices()
- - 加AddControllersAsServices()
我有一个授权Service【AuthService】继承抽象类【ApplicationService】,程序会后会将所有继承IApplicationService的Service动态转换为Api接口,在swagger使用原生Controller控制器接口调用AuthService是没有问题的,测试【AuthService】的动态接口报错【LazyServiceProvider为null】

容器注入选择的是:Autofac,所有服务均注册
抽象类代码如下:
其中LazyServiceProvider是通过属性注入来实现的
[Authorize]
public abstract class ApplicationService : IApplicationService, IDynamicApi
{
/// summary
/// 懒加载服务驱动(属性注入)
/// /summary
[Autowired]
public ILazyServiceProvider LazyServiceProvider { get; set; }
#region Private-Attribute
private IMapper _ObjectMapper;
private ICurrentUserService _CurrentUser;
private IPermissionChecker _IPermissionChecker;
#endregion Private-Attribute
#region Protected-Attribute
/// summary
/// AutoMap
/// /summary
protected IMapper ObjectMapper
{
get
{
if (_ObjectMapper == null)
{
_ObjectMapper = LazyServiceProvider.LazyGetRequiredServiceIMapper();
}
return _ObjectMapper;
}
}
/// summary
/// 当前用户
/// /summary
protected ICurrentUserService CurrentUser
{
get
{
if (_CurrentUser == null)
{
_CurrentUser = LazyServiceProvider.LazyGetRequiredServiceICurrentUserService();
}
return _CurrentUser;
}
}
/// summary
/// 权限检查
/// /summary
protected IPermissionChecker PermissionChecker
{
get
{
if (_IPermissionChecker == null)
{
_IPermissionChecker = LazyServiceProvider.LazyGetRequiredServiceIPermissionChecker();
}
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 属性注入未生效内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
您可能感兴趣的文章:- ASP.NET Core 奇淫技巧之伪属性注入的实现
相关标签:
相关推荐
专题
+ 收藏
+ 收藏
+ 收藏
+ 收藏
+ 收藏
最新数据
相关文章
详解.NET Core如何构建一个弹性的HTTP请求机制
.NET Core使用Redis实现创建分布式锁
.NET内存管理释放的两种方式
基于.NET8实现WinFrom应用窗口自动缩放功能
浅析如何在 ASP.NET Core中实现速率限制
.NET Core 委托原理解析(最新推荐)
.NET 9 new features-Microsoft.ML.Tokenizers 库(文本标记化功能)
如何在 .NET 中使用 Tesseract 识别图片文字
ASP.NET Core Web API之Token验证的实现
asp.net core web api项目添加自定义中间件的实现
AI精选
