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

容器注入選擇的是:Autofac,所有服務(wù)均注冊(cè)
抽象類代碼如下:
其中LazyServiceProvider是通過(guò)屬性注入來(lái)實(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(); // 這很重要,確??刂破饔蒁I容器解析
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框架管理
限制:
無(wú)法使用Autofac等第三方容器的高級(jí)功能(如屬性注入)
無(wú)法自定義控制器的解析過(guò)程
- 加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)
但可以通過(guò)注冊(cè)時(shí)指定來(lái)改變生命周期
到此這篇關(guān)于Asp.Net 動(dòng)態(tài)接口中屬性注入未生效的文章就介紹到這了,更多相關(guān)Asp.Net 屬性注入未生效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net 頁(yè)面?zhèn)髦档膸讉€(gè)方法
在網(wǎng)頁(yè)應(yīng)用程序的開(kāi)發(fā)中,頁(yè)面之間的傳值應(yīng)該是最常見(jiàn)的問(wèn)題了。2009-11-11
ASP.NET/C#中如何調(diào)用動(dòng)態(tài)鏈接庫(kù)DLL
這篇文章主要為大家詳細(xì)介紹了ASP.NET/C#中如何調(diào)用動(dòng)態(tài)鏈接庫(kù)DLL,感興趣的小伙伴們可以參考一下2016-03-03
asp.net下結(jié)合HttpHandler實(shí)現(xiàn)圖片防盜鏈
asp.net防圖片盜鏈HttpHandler2010-07-07
.net實(shí)現(xiàn)網(wǎng)站用戶登錄認(rèn)證
本文給大家介紹的是.net實(shí)現(xiàn)網(wǎng)站用戶登錄認(rèn)證的方法和實(shí)例,都非常的簡(jiǎn)單實(shí)用,需要的小伙伴可以參考下。2015-11-11
Asp.net Core 1.1 升級(jí)后操作mysql出錯(cuò)的解決辦法
這篇文章主要介紹了Asp.net Core 1.1 升級(jí)后操作mysql出錯(cuò)的解決辦法,需要的朋友可以參考下2016-12-12
Visual Studio Debug實(shí)戰(zhàn)教程之基礎(chǔ)入門
這篇文章主要給大家介紹了關(guān)于Visual Studio Debug實(shí)戰(zhàn)教程之基礎(chǔ)入門的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
asp.net實(shí)現(xiàn)導(dǎo)出DataTable數(shù)據(jù)到Word或者Excel的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)導(dǎo)出DataTable數(shù)據(jù)到Word或者Excel的方法,涉及asp.net操作office文件的相關(guān)技巧,需要的朋友可以參考下2016-08-08
asp.net頁(yè)面master頁(yè)面與ascx用戶控件傳值的問(wèn)題
aspx 頁(yè)面,master頁(yè)面與ascx用戶控件傳值的問(wèn)題2010-03-03

