欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Asp.Net 動態(tài)接口中屬性注入未生效的問題解決

 更新時間:2025年06月28日 11:02:56   作者:mouka~  
這篇文章主要介紹了Asp.Net 動態(tài)接口中屬性注入未生效的問題解決,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

我有一個授權(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()的主要作用是:

  1. 將控制器注冊為服務(wù):將所有控制器類注冊到依賴注入(DI)容器中

  2. 使用DI容器解析控制器:確??刂破鲗嵗蒁I容器創(chuàng)建,而不是由MVC框架直接實例化

加與不加的區(qū)別:

- 不加AddControllersAsServices()

  1. 控制器創(chuàng)建方式

    • MVC框架會直接使用 ActivatorUtilities.CreateInstance 創(chuàng)建控制器實例

    • 只支持構(gòu)造函數(shù)注入,不支持屬性注入

  2. 生命周期

    • 每個請求都會創(chuàng)建新的控制器實例

    • 生命周期完全由MVC框架管理

  3. 限制

    • 無法使用Autofac等第三方容器的高級功能(如屬性注入)

    • 無法自定義控制器的解析過程

- 加AddControllersAsServices()

  1. 控制器創(chuàng)建方式

    • 控制器實例由DI容器創(chuàng)建

    • 支持完整的DI功能,包括構(gòu)造函數(shù)注入和屬性注入

  2. 優(yōu)勢

    • 可以使用第三方容器(如Autofac)的所有功能

    • 支持屬性注入

    • 可以自定義控制器的生命周期

    • 可以在控制器解析前后執(zhí)行自定義邏輯

  3. 生命周期

    • 默認仍然是每個請求創(chuàng)建新實例(Transient)

    • 但可以通過注冊時指定來改變生命周期

到此這篇關(guān)于Asp.Net 動態(tài)接口中屬性注入未生效的文章就介紹到這了,更多相關(guān)Asp.Net 屬性注入未生效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論