Как я могу получить доступ к AppSettings из ActionFilterAttribute - PullRequest
0 голосов
/ 28 июня 2018

Мне нужно получить значения из файла appsettings.json в ActionFilterAttribute. Я перешел по этой ссылке ( Как я могу получить доступ к AppSettings из ActionFilterAttribute в ASP.NET Core ), но это не помогает мне, потому что мне нужно передать параметры в мой настраиваемый фильтр, а также использовать некоторые из наборов приложений. 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" };
    }

}

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Вы можете добавить статическое свойство в ваш класс 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");
}
0 голосов
/ 28 июня 2018

В вашем случае 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)]

И не забудьте зарегистрировать IConfiguration и атрибут в Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
   ...    
   services.AddSingleton<IConfiguration>(Configuration);
   services.AddScoped<ThrottleAttribute>();
}
0 голосов
/ 28 июня 2018

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>();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...