亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用依賴注入過濾屬性

使用依賴注入過濾屬性

C#
蕭十郎 2022-07-23 17:56:51
我試圖完全理解依賴注入。我正在定義一個過濾器并想從配置文件中讀取。在過濾器內部實例化配置是更好的做法,還是可以在全局范圍內這樣做,例如在啟動時?如果是這樣,有什么指示如何做到這一點?public class CompanyFilter : ActionFilterAttribute{   string _ERPUrl;   public CompanyFilter(IConfiguration iconfiguration)   {       ERPUrl = iconfiguration.GetSection("AppSettings").GetSection("ERPUrl").Value;      }    public override void OnActionExecuting(ActionExecutingContext filterContext)    {        if (filterContext.Controller is Controller controller)            controller.ViewBag.ERPUrl = _ERPUrl;                  //filterContext.Controller.ViewBag.Company = "Test";    }}創業班public class Startup{    public Startup(IConfiguration configuration)    {        Configuration = configuration;    }....控制器namespace Projects.Controllers{    [CompanyFilter]    public class HomeController : Controller    {....產生以下錯誤。Controllers\HomeController.cs(14,6):錯誤 CS7036:沒有給出與“CompanyFilter.CompanyFilter(IConfiguration)”所需的形式參數“iconfiguration”相對應的參數
查看完整描述

3 回答

?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

我建議您使用IOptions<T>.Net Core 支持的所有優勢從文件中檢索配置。您可以在此處查看如何操作。

此外,要將其注入到依賴注入解析器中,請將其作為瞬態或作用域或單例添加services.AddTransient(p => new MyService(mySettings));到您的ConfigureServices()函數中(決定哪一個更適合您)。

如果您堅持使用IConfiguration來檢索配置并解決您遇到的問題,您應該IConfiguration像這樣注入您的實例services.AddSingleton(Configuration);。希望這能解決您的問題。


查看完整回答
反對 回復 2022-07-23
?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

根據此處的一些反饋,可以通過添加到 Startup.cs 來執行以下操作。


services.AddMvc(options => {

   options.Filters.Add(new ERPFilter(Configuration));

}

可以根據上述要點考慮 url 以提高性能。


url = ...

services.AddMvc(options => {

   options.Filters.Add(new ERPFilter(url));

}


查看完整回答
反對 回復 2022-07-23
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

要根據其他人和我自己昨天提供的評論提供答案,建議注入IOptions<T>您的過濾器或任何其他需要注入配置數據的對象。


您可以像這樣將您的 ERP 設置添加到您的 appSettings.json 文件中


{

  "Logging": {

    "LogLevel": {

      "Default": "Warning"

    }

  },

  "AllowedHosts": "*",

  "Erp": {

    "Url": "https://localhost"

  }

}

要將您的設置注入依賴項,您必須通過注冊它ConfigureServices,您還會注意到CompanyFilter已添加到IServiceCollectionvia AddTransient,這是為了允許ServiceFilterAttribute在稍后階段解決它并注入過濾器具有的任何依賴項。


public void ConfigureServices(IServiceCollection services)

{

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);


    services.Configure<ErpSettings>(Configuration.GetSection("Erp"));

    services.AddTransient<CompanyFilter>();

}

要將過濾器應用于控制器操作,請使用 ServiceFilterAttribute(Type)`


[HttpGet]

[ServiceFilter(typeof(CompanyFilter))]

public ActionResult<IEnumerable<string>> Get()

{

    return new string[] { ViewBag.ERPUrl };

}

在上面的代碼中,您將看到我返回 ViewBag.ERPUrl,這是因為您ComapnyFilter已覆蓋OnActionExecuting在調用操作之前執行的操作,而OnActionExecuted在您的操作完成后且在響應返回給調用者之前調用。


這就是CompanyFilter現在的樣子,你會注意到構造函數現在接受IOptions<ErpSettings>


public class CompanyFilter : ActionFilterAttribute

{

    private readonly ErpSettings erpSettings;

    public CompanyFilter(IOptions<ErpSettings> erpSettings)

    {

        this.erpSettings= erpSettings.Value;


    }


    public override void OnActionExecuting(ActionExecutingContext context)

    {

        if (context.Controller is Controller controller)

            controller.ViewBag.ERPUrl = erpSettings.Url;

    }

}

完成所有這些后,這就是響應

http://img1.sycdn.imooc.com//62dbc60c0001dfa903580115.jpg

查看完整回答
反對 回復 2022-07-23
  • 3 回答
  • 0 關注
  • 145 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號