Asp.Net 動(dòng)態(tài)接口中屬性注入未生效的問題解決
我有一個(gè)授權(quán)Service【AuthService】繼承抽象類【ApplicationService】,程序會(huì)后會(huì)將所有繼承IApplicationService的Service動(dòng)態(tài)轉(zhuǎn)換為Api接口,在swagger使用原生Controller控制器接口調(diào)用AuthService是沒有問題的,測(cè)試【AuthService】的動(dòng)態(tài)接口報(bào)錯(cuò)【LazyServiceProvider為null】

容器注入選擇的是:Autofac,所有服務(wù)均注冊(cè)
抽象類代碼如下:
其中LazyServiceProvider是通過屬性注入來實(shí)現(xiàn)的
[Authorize]
public abstract class ApplicationService : IApplicationService, IDynamicApi
{
/// <summary>
/// 懶加載服務(wù)驅(qū)動(dòng)(屬性注入)
/// </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>
/// 當(dāng)前用戶
/// </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(); // 這很重要,確保控制器由DI容器解析
AddControllersAsServices()的主要作用是:
將控制器注冊(cè)為服務(wù):將所有控制器類注冊(cè)到依賴注入(DI)容器中
使用DI容器解析控制器:確??刂破鲗?shí)例由DI容器創(chuàng)建,而不是由MVC框架直接實(shí)例化
加與不加的區(qū)別:
- 不加AddControllersAsServices()
控制器創(chuàng)建方式:
MVC框架會(huì)直接使用
ActivatorUtilities.CreateInstance創(chuàng)建控制器實(shí)例只支持構(gòu)造函數(shù)注入,不支持屬性注入
生命周期:
每個(gè)請(qǐng)求都會(huì)創(chuàng)建新的控制器實(shí)例
生命周期完全由MVC框架管理
限制:
無法使用Autofac等第三方容器的高級(jí)功能(如屬性注入)
無法自定義控制器的解析過程
- 加AddControllersAsServices()
控制器創(chuàng)建方式:
控制器實(shí)例由DI容器創(chuàng)建
支持完整的DI功能,包括構(gòu)造函數(shù)注入和屬性注入
優(yōu)勢(shì):
可以使用第三方容器(如Autofac)的所有功能
支持屬性注入
可以自定義控制器的生命周期
可以在控制器解析前后執(zhí)行自定義邏輯
生命周期:
默認(rèn)仍然是每個(gè)請(qǐng)求創(chuàng)建新實(shí)例(Transient)
但可以通過注冊(cè)時(shí)指定來改變生命周期
到此這篇關(guān)于Asp.Net 動(dòng)態(tài)接口中屬性注入未生效的文章就介紹到這了,更多相關(guān)Asp.Net 屬性注入未生效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net簡(jiǎn)化接收參數(shù)值的函數(shù)
獲取querystring 參數(shù)名2008-05-05
用存儲(chǔ)過程向數(shù)據(jù)庫存值的具體實(shí)現(xiàn)
本文為大家介紹下使用存儲(chǔ)過程向數(shù)據(jù)庫存值的具體實(shí)現(xiàn)過程,感興趣的朋友不要錯(cuò)過2014-01-01
如何在ASP.Net Core使用分布式緩存的實(shí)現(xiàn)
這篇文章主要介紹了如何在ASP.Net Core使用分布式緩存的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
擴(kuò)展方法ToJSON() and ParseJSON()
AJAX編程經(jīng)常需要Object<=>JSON之間轉(zhuǎn)換,寫了二個(gè)擴(kuò)展方法: public static string ToJSON(this object obj) public static T ParseJSON<T>(this string str)2008-03-03
.NET微服務(wù)架構(gòu)CI/CD鏡像自動(dòng)分發(fā)
這篇文章介紹了.NET微服務(wù)架構(gòu)CI/CD實(shí)現(xiàn)鏡像自動(dòng)分發(fā)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
.NET客戶端實(shí)現(xiàn)Redis中的管道(PipeLine)與事物(Transactions)
本文主要介紹了.NET客戶端實(shí)現(xiàn)Redis中的管道(PipeLine)與事物(Transactions)的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-03-03
vs2010出現(xiàn)error MSB8008的解決方法
這篇文章主要為大家詳細(xì)介紹了vs2010問題error MSB8008: 指定的平臺(tái)工具集(v110)未安裝或無效的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

