问:


ASP.NET CORE MVC 如何在Filter中使用依赖注入来读取AppSettings

答:


Dependency injection is possible in filters as well.

Here is a simple way to get connection string

  1. public class EBisUserAuthResourceFilter : Attribute, IResourceFilter
  2. {
  3. private readonly string connectionString;
  4.  
  5. public EBisUserAuthResourceFilter(IConfiguration configuration)
  6. {
  7. this.connectionString = configuration
  8. .GetSection("ConnectionStrings:DefaultConnection").Value;
  9. }
  10. public void OnResourceExecuted(ResourceExecutedContext context)
  11. {
  12. // use this.connectionString
  13. }
  14.  
  15. public void OnResourceExecuting(ResourceExecutingContext context)
  16. {
  17. // use this.connectionString
  18. }
  19. }

Now you can use this filter

  1. [ServiceFilter(typeof(EBisUserAuthResourceFilter))]
  2. public class HomeController : Controller
  3. { }

You also need to add this Filter to the service collection

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddScoped<EBisUserAuthResourceFilter>();
  4.  
  5. // your existing code to add other services
  6. }

Another solution is to have a class representing the structure of the content of AppSettings.json file or a sub section and load that in your Startup classes' ConfigureServices method

  1. services.Configure<SiteSettings>(Configuration);

and now you can inject IOptions<SiteSettings> in the constructor of your filter and use the needed property values. I prefer this as it is less magic strings in my code.

  1. public class EBisUserAuthResourceFilter : Attribute, IResourceFilter
  2. {
  3. private readonly string connectionString;
  4.  
  5. public EBisUserAuthResourceFilter(IOptions<SiteSettings> settings)
  6. {
  7. this.connectionString = settings.Value.connectionString ;
  8. }
  9. public void OnResourceExecuted(ResourceExecutedContext context)
  10. {
  11. // use this.connectionString
  12. }
  13.  
  14. public void OnResourceExecuting(ResourceExecutingContext context)
  15. {
  16. // use this.connectionString
  17. }
  18. }

原文链接

补充:


当然还有个更简单的办法,就是在Filter里面直接通过.Net Core App的方式来读取AppSettings的值,这个方法是最灵活的:

appsettings.json

  1. {
  2. "Logging": {
  3. "IncludeScopes": false,
  4. "LogLevel": {
  5. "Default": "Warning"
  6. }
  7. },
  8. "AppSettings": {
  9. "CacheTimeSpan": 1200,
  10. "MD5PrivateKey": "KOPX&VDtt!890912hjk",
  11. "Auth_UserName": "Username",
  12. "Auth_Token": "Token"
  13. }
  14. }

构造一个AppSettings类来反序列化appsettings.json文件中AppSettings节点下的内容:

  1. public class AppSettings
  2. {
  3. public int CacheTimeSpan { get; set; }
  4. public string MD5PrivateKey { get; set; }
  5. public string Auth_UserName { get; set; }
  6. public string Auth_Token { get; set; }
  7. }

在Filter的构造函数中,构造AppSettings并读取其值:

  1. public class AuthenticationFilterAttribute : Attribute, IAuthorizationFilter
  2. {
  3. public AuthenticationFilterAttribute()
  4. {
  5. var builder = new ConfigurationBuilder()
  6. .SetBasePath(Directory.GetCurrentDirectory())
  7. .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
  8.  
  9. IConfigurationRoot configuration = builder.Build();
  10.  
  11. var appSettings=configuration.GetSection("AppSettings").Get<AppSettings>();
  12. int cacheTimeSpanValue = appSettings.CacheTimeSpan;
  13. }
  14.  
  15. public void OnAuthorization(AuthorizationFilterContext context)
  16. {
  17.  
  18. }
  19. }

.NET Core控制台项目读取AppSettings


其实在.NET Core控制台项目中也可以创建和读取AppSettings

首先你需要在.NET Core控制台项目中确保引用了下面四个Nuget包:

接下来,我们就可以在.NET Core控制台项目中创建一个appsettings.json文件如下:

  1. {
  2. "AppSettings": {
  3. "CacheTimeSpan": 1200,
  4. "MD5PrivateKey": "YUIOOASSA!@!##",
  5. "Auth_UserName": "Username",
  6. "Auth_Token": "Token"
  7. }
  8. }

注意要将appsettings.json文件的属性做修改,将"Copy to Output Directory"选项设置为"Copy if newer",如下:

然后同样定义一个AppSettings类来反序列化appsettings.json文件中AppSettings节点下的内容:

  1. public class AppSettings
  2. {
  3. public int CacheTimeSpan { get; set; }
  4. public string MD5PrivateKey { get; set; }
  5. public string Auth_UserName { get; set; }
  6. public string Auth_Token { get; set; }
  7. }

然后在.NET Core控制台项目的Main方法中,按照如下代码读取AppSettings的值即可:

  1. using Microsoft.Extensions.Configuration;
  2. using System;
  3. using System.IO;
  4.  
  5. namespace NetCoreEnvironmentVariable
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. var builder = new ConfigurationBuilder()
  12. .SetBasePath(Directory.GetCurrentDirectory())
  13. .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
  14.  
  15. IConfigurationRoot configuration = builder.Build();
  16.  
  17. var appSettings = configuration.GetSection("AppSettings").Get<AppSettings>();
  18. int cacheTimeSpanValue = appSettings.CacheTimeSpan;
  19. string authUserName = appSettings.Auth_UserName;
  20.  
  21. Console.WriteLine($"CacheTimeSpan={cacheTimeSpanValue}");
  22. Console.WriteLine($"Auth_UserName={authUserName}");
  23.  
  24. Console.WriteLine("Press any key to end...");
  25. Console.ReadKey();
  26. }
  27. }
  28. }

执行结果如下:

使用AddEnvironmentVariables方法配置读取操作系统的环境变量

我们还可以配置IConfigurationBuilder去加载操作系统环境变量的值,为此我们需要在.NET Core控制台项目中再引用一个Nuget包:

接下来我们在Windows操作系统中,添加两个环境变量:

AppSettings:CacheTimeSpan为5000

AppSettings:Password为abc123456

如下图所示:

之后,最好重启一下计算机,因为AddEnvironmentVariables方法使用类似于EnvironmentVariableTarget.Process参数的机制,来加载操作系统环境变量,所以需要重启计算机后才能够读取到操作系统环境变量的值。

然后我们将.NET Core控制台项目的Main方法改为如下:

  1. using Microsoft.Extensions.Configuration;
  2. using System;
  3. using System.IO;
  4.  
  5. namespace NetCoreEnvironmentVariable
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. var builder = new ConfigurationBuilder()
  12. .SetBasePath(Directory.GetCurrentDirectory())
  13. .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
  14. .AddEnvironmentVariables();//使用AddEnvironmentVariables方法,配置让IConfigurationBuilder加载操作系统中的环境变量,由于这里AddEnvironmentVariables方法在上面的AddJsonFile方法的后面,所以在"appsettings.json"文件中与操作系统环境变量同名的键值,会被操作系统环境变量的值所覆盖
  15.  
  16. IConfigurationRoot configuration = builder.Build();
  17.  
  18. var appSettings = configuration.GetSection("AppSettings").Get<AppSettings>();
  19. int cacheTimeSpanValue = appSettings.CacheTimeSpan;//由于在操作系统环境变量中,我们定义了AppSettings:CacheTimeSpan为5000,所以"appsettings.json"文件中CacheTimeSpan为1200的值会被覆盖,所以这里实际上得到的是操作系统环境变量AppSettings:CacheTimeSpan的值5000
  20. string authUserName = appSettings.Auth_UserName;//由于在操作系统环境变量中,没有定义AppSettings:Auth_UserName,所以这里得到的还是"appsettings.json"文件中Auth_UserName的值Username
  21. string password = configuration["AppSettings:Password"];//获取操作系统环境变量AppSettings:Password的值abc123456
  22.  
  23. Console.WriteLine($"CacheTimeSpan={cacheTimeSpanValue}");
  24. Console.WriteLine($"Auth_UserName={authUserName}");
  25. Console.WriteLine($"Password={password}");
  26.  
  27. Console.WriteLine("Press any key to end...");
  28. Console.ReadKey();
  29. }
  30. }
  31. }

注意"appsettings.json"文件中的json类型层次结构,可以用冒号":"来进行表达,所以我们可以看到,上面代码中操作系统环境变量AppSettings:CacheTimeSpan,等同于"appsettings.json"文件中AppSettings属性下的CacheTimeSpan属性。

运行上面代码,执行结果如下:

可以看到,我们成功地读出了操作系统环境变量AppSettings:CacheTimeSpan和AppSettings:Password的值。

ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings,及.NET Core控制台项目中读取AppSettings的更多相关文章

  1. ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package

    目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我 ...

  2. ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入

    原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...

  3. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)

    在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...

  4. ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下

    ADO.NET   一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data  → DataTable, ...

  5. ASP.NET Core如何在ActionFilterAttribute里做依赖注入

    在ASP.NET Core里,我们可以使用构造函数注入很方便地对Controller,ViewComponent等部件做依赖注入.但是如何给过滤器ActionFilterAttribute也用上构造函 ...

  6. ASP.NET Core 在 JSON 文件中配置依赖注入

    前言 在上一篇文章中写了如何在MVC中配置全局路由前缀,今天给大家介绍一下如何在在 json 文件中配置依赖注入. 在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等 ...

  7. ASP.NET Core中的依赖注入(2):依赖注入(DI)

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...

  8. ASP.NET Core 中的依赖注入

    目录 什么是依赖注入 ASP .NET Core 中使用依赖注入 注册 使用 释放 替换为其它的 Ioc 容器 参考 什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要 ...

  9. ASP.NET Core中的依赖注入(1):控制反转(IoC)

    ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...

随机推荐

  1. json_decode($json, true) true什么意思

    <?php $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}' ...

  2. 初学者需要IPython 与 Jupyter Notebook 吗?

    ipython 是 jupyter notebook的前身并拥有ipython的全部功能         jupyter拥有 cell, markdown 整合的功能, 能同时运行代码, 而且是多组的 ...

  3. Spring 框架(三)

    1 spring l AOP :切面编程 切面:切入点 和 通知 结合 l spring aop 编程 <aop:config> 方法1: <aop:pointcut express ...

  4. Java链接 Oracle11g R2

    菜鸟学习Oracle数据库,使用Java代码链接数据库. 首先要配置Eclipse,在新建的工程中,Package Explorer->工程名->Build path->Add ex ...

  5. Unable to create a constant value of type 'System.Object'. Only primitive types or enumeration types are supported in this context.

    代码如下: var query = from s in db.LoginUserServices join ss in db.Services on s.ServiceType equals ss.C ...

  6. golang rest api example

    package main import ( "net/http" "github.com/gin-gonic/gin" "github.com/jin ...

  7. 关于map容器的元素被无参初始化

    使用C++中的map容器定义一个mp,当你执行if语句判断mp[3]是否为1时,那么如果mp[3]以前不存在,此时mp[3]就会被无参初始化,second赋值为0. 以下的程序可以证明这一点.执行了第 ...

  8. Timeout occurred while waiting for latch: class 'COLUMNSTORE_ROWGROUP_COLLECTION'

    今天发现线上数据库主从延迟严重: SELECT ag.name AS ag_name, ar.replica_server_name AS ag_replica_server, dr_state.da ...

  9. 初看Mybatis 源码 (三) SQL是怎么执行的

    前面说到Java动态代理,Mybatis通过这种方式实现了我们通过getMapper方式得到的Dao接口,可以直接通过接口的没有实现的方法来执行sql. AuthUserDao mapper = se ...

  10. 属性锁TimeLock

    属性锁TimeLock 这是本人所写的几个类,用于对属性设置值时进行锁定与解锁,适用于高逼格动画当中. 源码: TimeLock.h 与 TimeLock.m // // TimeLock.h // ...