Asp.Net 動態(tài)接口中屬性注入未生效的問題解決
我有一個授權(quán)Service【AuthService】繼承抽象類【ApplicationService】,程序會后會將所有繼承IApplicationService的Service動態(tài)轉(zhuǎn)換為Api接口,在swagger使用原生Controller控制器接口調(diào)用AuthService是沒有問題的,測試【AuthService】的動態(tài)接口報錯【LazyServiceProvider為null】
容器注入選擇的是:Autofac,所有服務(wù)均注冊
抽象類代碼如下:
其中LazyServiceProvider是通過屬性注入來實現(xiàn)的
[Authorize] public abstract class ApplicationService : IApplicationService, IDynamicApi { /// <summary> /// 懶加載服務(wù)驅(qū)動(屬性注入) /// </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.LazyGetRequiredService<IMapper>(); } return _ObjectMapper; } } /// <summary> /// 當前用戶 /// </summary> protected ICurrentUserService CurrentUser { get { if (_CurrentUser == null) { _CurrentUser = LazyServiceProvider.LazyGetRequiredService<ICurrentUserService>(); } return _CurrentUser; } } /// <summary> /// 權(quán)限檢查 /// </summary> protected IPermissionChecker PermissionChecker { get { if (_IPermissionChecker == null) { _IPermissionChecker = LazyServiceProvider.LazyGetRequiredService<IPermissionChecker>(); } return _IPermissionChecker; } } #endregion Protected-Attribute }
解決方法:
在ASP.NET Core配置中:
builder.Services.AddControllers() .AddControllersAsServices(); // 這很重要,確??刂破饔蒁I容器解析
AddControllersAsServices()
的主要作用是:
將控制器注冊為服務(wù):將所有控制器類注冊到依賴注入(DI)容器中
使用DI容器解析控制器:確??刂破鲗嵗蒁I容器創(chuàng)建,而不是由MVC框架直接實例化
加與不加的區(qū)別:
- 不加AddControllersAsServices()
控制器創(chuàng)建方式:
MVC框架會直接使用
ActivatorUtilities.CreateInstance
創(chuàng)建控制器實例只支持構(gòu)造函數(shù)注入,不支持屬性注入
生命周期:
每個請求都會創(chuàng)建新的控制器實例
生命周期完全由MVC框架管理
限制:
無法使用Autofac等第三方容器的高級功能(如屬性注入)
無法自定義控制器的解析過程
- 加AddControllersAsServices()
控制器創(chuàng)建方式:
控制器實例由DI容器創(chuàng)建
支持完整的DI功能,包括構(gòu)造函數(shù)注入和屬性注入
優(yōu)勢:
可以使用第三方容器(如Autofac)的所有功能
支持屬性注入
可以自定義控制器的生命周期
可以在控制器解析前后執(zhí)行自定義邏輯
生命周期:
默認仍然是每個請求創(chuàng)建新實例(Transient)
但可以通過注冊時指定來改變生命周期
到此這篇關(guān)于Asp.Net 動態(tài)接口中屬性注入未生效的文章就介紹到這了,更多相關(guān)Asp.Net 屬性注入未生效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET/C#中如何調(diào)用動態(tài)鏈接庫DLL
這篇文章主要為大家詳細介紹了ASP.NET/C#中如何調(diào)用動態(tài)鏈接庫DLL,感興趣的小伙伴們可以參考一下2016-03-03asp.net下結(jié)合HttpHandler實現(xiàn)圖片防盜鏈
asp.net防圖片盜鏈HttpHandler2010-07-07Asp.net Core 1.1 升級后操作mysql出錯的解決辦法
這篇文章主要介紹了Asp.net Core 1.1 升級后操作mysql出錯的解決辦法,需要的朋友可以參考下2016-12-12Visual Studio Debug實戰(zhàn)教程之基礎(chǔ)入門
這篇文章主要給大家介紹了關(guān)于Visual Studio Debug實戰(zhàn)教程之基礎(chǔ)入門的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09asp.net實現(xiàn)導(dǎo)出DataTable數(shù)據(jù)到Word或者Excel的方法
這篇文章主要介紹了asp.net實現(xiàn)導(dǎo)出DataTable數(shù)據(jù)到Word或者Excel的方法,涉及asp.net操作office文件的相關(guān)技巧,需要的朋友可以參考下2016-08-08asp.net頁面master頁面與ascx用戶控件傳值的問題
aspx 頁面,master頁面與ascx用戶控件傳值的問題2010-03-03