Атрибут фильтра с внедрением зависимостей

Попробуйте следующее:

^-?0*(1?[0-9]{1,3}|20[0-4][0-9]|205[0-5])$

Регулярное выражение перед скобками совпадает с необязательным - и любыми ведущими 0.

Первая часть в скобках (1?[0-9]{1,3}) совпадает с 0-1999.

Вторая часть в скобках (20[0-4][0-9]) соответствует 2000-2049.

Третья часть в скобках (205[0-5]) соответствует 2050-2055 .

0
задан Jasen 16 January 2019 в 18:39
поделиться

3 ответа

Основываясь на некоторых отзывах, можно выполнить следующее, добавив файл Startup.cs.

services.AddMvc(options => {
   options.Filters.Add(new ERPFilter(Configuration));
}

URL может быть учтено в соответствии с приведенным выше пунктом для повышения производительности.

url = ...
services.AddMvc(options => {
   options.Filters.Add(new ERPFilter(url));
}
0
ответ дан ffejrekaburb 16 January 2019 в 18:39
поделиться

Предоставить ответ на основе комментариев, предоставленных вчера другими пользователями. Само собой, рекомендуется добавить IOptions<T> в ваши фильтры или любые другие объекты, которые требуют ввода данных конфигурации.

Вы можете добавить свои настройки ERP в свой файл appSettings.json, например, так:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Erp": {
    "Url": "https://localhost"
  }
}

Чтобы добавить ваши настройки в зависимости, вы должны зарегистрировать их через ConfigureServices, вы также заметите, что CompanyFilter добавляется в IServiceCollection через 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;
    }
}

После всего этого, это ответ

API Response

0
ответ дан ColinM 16 January 2019 в 18:39
поделиться

Я бы предложил вам использовать IOptions<T> для получения конфигурации из файла со всеми преимуществами, поддерживаемыми .Net Core. Вы можете увидеть, как это сделать здесь .

Кроме того, чтобы добавить его в распознаватель инъекций зависимостей, добавьте services.AddTransient(p => new MyService(mySettings)); к вашей функции ConfigureServices() в качестве переходного процесса или области действия или синглтона (решите, какой из них вам больше подходит).

Если вы настаиваете на использовании IConfiguration для получения конфигурации и решения возникшей проблемы, вам следует внедрить свой экземпляр IConfiguration следующим образом services.AddSingleton(Configuration);. Надеюсь, что это решит вашу проблему.

0
ответ дан Hasan 16 January 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: