使用依赖注入过滤属性

我试图完全理解依赖注入。我正在定义一个过滤器并想从配置文件中读取。在过滤器内部实例化配置是更好的做法,还是可以在全局范围内这样做,例如在启动时?如果是这样,有什么指示如何做到这一点?


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”相对应的参数


萧十郎
浏览 120回答 3
3回答

偶然的你

我建议您使用IOptions<T>.Net Core 支持的所有优势从文件中检索配置。您可以在此处查看如何操作。此外,要将其注入到依赖注入解析器中,请将其作为瞬态或作用域或单例添加services.AddTransient(p => new MyService(mySettings));到您的ConfigureServices()函数中(决定哪一个更适合您)。如果您坚持使用IConfiguration来检索配置并解决您遇到的问题,您应该IConfiguration像这样注入您的实例services.AddSingleton(Configuration);。希望这能解决您的问题。

宝慕林4294392

根据此处的一些反馈,可以通过添加到 Startup.cs 来执行以下操作。services.AddMvc(options => {&nbsp; &nbsp;options.Filters.Add(new ERPFilter(Configuration));}可以根据上述要点考虑 url 以提高性能。url = ...services.AddMvc(options => {&nbsp; &nbsp;options.Filters.Add(new ERPFilter(url));}

缥缈止盈

要根据其他人和我自己昨天提供的评论提供答案,建议注入IOptions<T>您的过滤器或任何其他需要注入配置数据的对象。您可以像这样将您的 ERP 设置添加到您的 appSettings.json 文件中{&nbsp; "Logging": {&nbsp; &nbsp; "LogLevel": {&nbsp; &nbsp; &nbsp; "Default": "Warning"&nbsp; &nbsp; }&nbsp; },&nbsp; "AllowedHosts": "*",&nbsp; "Erp": {&nbsp; &nbsp; "Url": "https://localhost"&nbsp; }}要将您的设置注入依赖项,您必须通过注册它ConfigureServices,您还会注意到CompanyFilter已添加到IServiceCollectionvia AddTransient,这是为了允许ServiceFilterAttribute在稍后阶段解决它并注入过滤器具有的任何依赖项。public void ConfigureServices(IServiceCollection services){&nbsp; &nbsp; services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);&nbsp; &nbsp; services.Configure<ErpSettings>(Configuration.GetSection("Erp"));&nbsp; &nbsp; services.AddTransient<CompanyFilter>();}要将过滤器应用于控制器操作,请使用 ServiceFilterAttribute(Type)`[HttpGet][ServiceFilter(typeof(CompanyFilter))]public ActionResult<IEnumerable<string>> Get(){&nbsp; &nbsp; return new string[] { ViewBag.ERPUrl };}在上面的代码中,您将看到我返回 ViewBag.ERPUrl,这是因为您ComapnyFilter已覆盖OnActionExecuting在调用操作之前执行的操作,而OnActionExecuted在您的操作完成后且在响应返回给调用者之前调用。这就是CompanyFilter现在的样子,你会注意到构造函数现在接受IOptions<ErpSettings>public class CompanyFilter : ActionFilterAttribute{&nbsp; &nbsp; private readonly ErpSettings erpSettings;&nbsp; &nbsp; public CompanyFilter(IOptions<ErpSettings> erpSettings)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; this.erpSettings= erpSettings.Value;&nbsp; &nbsp; }&nbsp; &nbsp; public override void OnActionExecuting(ActionExecutingContext context)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (context.Controller is Controller controller)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; controller.ViewBag.ERPUrl = erpSettings.Url;&nbsp; &nbsp; }}完成所有这些后,这就是响应
打开App,查看更多内容
随时随地看视频慕课网APP