为了账号安全,请及时绑定邮箱和手机立即绑定

使用依赖注入过滤属性

使用依赖注入过滤属性

C#
萧十郎 2022-07-23 17:56:51
我试图完全理解依赖注入。我正在定义一个过滤器并想从配置文件中读取。在过滤器内部实例化配置是更好的做法,还是可以在全局范围内这样做,例如在启动时?如果是这样,有什么指示如何做到这一点?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”相对应的参数
查看完整描述

3 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

我建议您使用IOptions<T>.Net Core 支持的所有优势从文件中检索配置。您可以在此处查看如何操作。

此外,要将其注入到依赖注入解析器中,请将其作为瞬态或作用域或单例添加services.AddTransient(p => new MyService(mySettings));到您的ConfigureServices()函数中(决定哪一个更适合您)。

如果您坚持使用IConfiguration来检索配置并解决您遇到的问题,您应该IConfiguration像这样注入您的实例services.AddSingleton(Configuration);。希望这能解决您的问题。


查看完整回答
反对 回复 2022-07-23
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

根据此处的一些反馈,可以通过添加到 Startup.cs 来执行以下操作。


services.AddMvc(options => {

   options.Filters.Add(new ERPFilter(Configuration));

}

可以根据上述要点考虑 url 以提高性能。


url = ...

services.AddMvc(options => {

   options.Filters.Add(new ERPFilter(url));

}


查看完整回答
反对 回复 2022-07-23
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

要根据其他人和我自己昨天提供的评论提供答案,建议注入IOptions<T>您的过滤器或任何其他需要注入配置数据的对象。


您可以像这样将您的 ERP 设置添加到您的 appSettings.json 文件中


{

  "Logging": {

    "LogLevel": {

      "Default": "Warning"

    }

  },

  "AllowedHosts": "*",

  "Erp": {

    "Url": "https://localhost"

  }

}

要将您的设置注入依赖项,您必须通过注册它ConfigureServices,您还会注意到CompanyFilter已添加到IServiceCollectionvia 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;

    }

}

完成所有这些后,这就是响应

//img1.sycdn.imooc.com//62dbc60c0001dfa903580115.jpg

查看完整回答
反对 回复 2022-07-23
  • 3 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信