簡體   English   中英

如何從ActionFilterAttribute訪問AppSettings

[英]How can I access AppSettings from an ActionFilterAttribute

我需要從ActionFilterAttribute中的appsettings.json文件中獲取值。 我點擊了此鏈接( 如何從ASP.NET Core中的ActionFilterAttribute訪問AppSettings ),但這無濟於事,因為我需要將參數傳遞給自定義過濾器,並且還需要使用來自appsettings.json的參數。 例如

//Filter.cs

[AttributeUsage(AttributeTargets.Method)]
public class ThrottleAttribute : ActionFilterAttribute
{
    public string Count { get; set; }

    private static MemoryCache Cache { get; } = new MemoryCache(new MemoryCacheOptions());

    public override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
    {
        //Compare this.Count with GetValueFromAppSettings.json
    }
}

//Controller.cs

[ApiController]
[Route("api/[controller]")]
public class ValuesController : BaseController
{
    // GET api/values
    [HttpGet]
    [Authorize]
    [Throttle(Count = 15)]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new[] { "value1", "value2" };
    }

}

appsettings.json應該在DI中注冊,因此您可以將IConfiguration傳遞給ThrottleAttribute構造函數並通過DI從中獲取值,但是您需要創建工廠才能使其工作:

public class ThrottleAttributeFactory: ActionFilterAttribute, IFilterFactory
{
    public string Count { get; set; }

    public bool IsReusable => false;

    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
    {
        var attribute = serviceProvider.GetService<ThrottleAttribute>();

        attribute.Count = Count;

        return attribute;
    }
}

屬性:

public class ThrottleAttribute : ActionFilterAttribute
{
    private readonly IConfiguration _config;

    public string Count { get; set; }

    public ThrottleAttribute(IConfiguration config)
    {
        _config = config;
    }
    //rest of code omitted
}

在您的方法中:

{
    var value = _config.GetValue<int>("json:key");
}

並在控制器中將[Throttle(Count = 15)]替換為[ThrottleAttributeFactory(Count = 15)]

還要注冊屬性: services.AddScoped<ThrottleAttribute>();

在您的情況下, IFilterFactory實現將是最佳選擇。

public class ThrottleAttributeFactory : Attribute, IFilterFactory
{
    public string Count { get; set; }

    public bool IsReusable => false;

    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
    {
        var filter = serviceProvider.GetService<ThrottleAttribute>();

        filter.Count = Count;

        return filter;
    }
}

然后可以將其注入構造函數

private readonly IConfiguration config;

public ThrottleAttribute(IConfiguration config)
{
    this.config = config;
}

您必須將[Throttle(Count = 15)]更改為[ThrottleAttributeFactory(Count = 15)]

並且不要忘記在Startup.cs中注冊IConfiguration和屬性:

public void ConfigureServices(IServiceCollection services)
{
   ...    
   services.AddSingleton<IConfiguration>(Configuration);
   services.AddScoped<ThrottleAttribute>();
}

您可以在Throttle類中添加靜態屬性,並將配置值存儲在其中。 然后,可以在啟動類中設置該值。

[AttributeUsage(AttributeTargets.Method)]
public class ThrottleAttribute : ActionFilterAttribute
{
    public string Count { get; set; }

    public static string ConfigCount { get; set; }

    private static MemoryCache Cache { get; } = new MemoryCache(new MemoryCacheOptions());

    public override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
    {
        //Compare this.Count with GetValueFromAppSettings.json
    }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    ThrottleAttribute.ConfigCount = Configuration.GetValue<int>("key");
}

如何訪問列表<object>來自 appsettings.Json?<div id="text_translate"><p> 在我的 appsettings.json 我有一個這樣的字段</p><pre> "MyFields": [ { "name":"one", "type":"type1" "parameters":[{"key":"url","value":"myurl.com"}, {"key":"data","value":"mydata"}] }, { "name":"two", "type":"type2"... .. and so on } ]</pre><p> 我制作了一個具有以下屬性的 class Myfield:</p><pre> public class MyField { [JsonProperty] public string? name { get; set; } [JsonProperty] public string? type { get; set; } [JsonProperty] public IDictionary<string,string>? parameters { get; set; } }</pre><p> 我正在嘗試使用配置在另一個 class 中訪問它,如下所示:</p><pre> //config is the configuration var myFields = config.GetSection("MyFields").Get<List<MyField>>();</pre><p> 問題是 myFields 結果是空的。 但是當我通過消除“參數”字段來做同樣的事情時,它就像一個魅力。</p><p> 我知道這與匹配不當有關,但能得到一些幫助會很棒。</p></div></object>

[英]How can I access a List<object> from appsettings.Json?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 如何從 ASP.NET Core 中的 ActionFilterAttribute 訪問 AppSettings 如何從ApiController中的ActionFilterAttribute訪問屬性? 誰能告訴我如何從ActionFilterAttribute方法訪問DbContext ActionFilterAttribute如何訪問受保護的int? 從BaseController? 如何訪問列表<object>來自 appsettings.Json?<div id="text_translate"><p> 在我的 appsettings.json 我有一個這樣的字段</p><pre> "MyFields": [ { "name":"one", "type":"type1" "parameters":[{"key":"url","value":"myurl.com"}, {"key":"data","value":"mydata"}] }, { "name":"two", "type":"type2"... .. and so on } ]</pre><p> 我制作了一個具有以下屬性的 class Myfield:</p><pre> public class MyField { [JsonProperty] public string? name { get; set; } [JsonProperty] public string? type { get; set; } [JsonProperty] public IDictionary<string,string>? parameters { get; set; } }</pre><p> 我正在嘗試使用配置在另一個 class 中訪問它,如下所示:</p><pre> //config is the configuration var myFields = config.GetSection("MyFields").Get<List<MyField>>();</pre><p> 問題是 myFields 結果是空的。 但是當我通過消除“參數”字段來做同樣的事情時,它就像一個魅力。</p><p> 我知道這與匹配不當有關,但能得到一些幫助會很棒。</p></div></object> 如何將 LoggerFactory 的實例傳遞給 ActionFilterAttribute 我可以從 EF Core 遷移訪問 appsettings 嗎? 如何在類庫ActionFilterAttribute中訪問Unity容器? 如何在自定義ActionFilterAttribute中訪問模型和元數據? 如何從 appsettings.json 填充字典?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM