Чтобы получить ответ на основе комментариев, предоставленных вчера другими людьми и мной, рекомендуется добавить 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;
}
}
Со всем этим сделано, это ответ