如何从 .net 核心中的自定义过滤器中的 appsettings.json 获取连接字符串
How to get connection string from appsettings.json inside custom filter in .net core
我有一个控制器 EBisUserController,它包含一个 public 属性 通过依赖注入从 appsettings.json
获得的 ConnectionString。控制器有一个属性过滤器 'EBisUserAuthResourceFilter' 需要使用在控制器中找到的 属性 ConnectionString。访问 ConnectionString 的最高效方法是什么。我有一个我想要的工作示例,但知道这不是执行此操作的正确方法,因为它必须为每个事务打开和读取文件。
public class EBisUserAuthResourceFilter : Attribute, IResourceFilter {
private string _connectionString;
public EBisUserAuthResourceFilter() {
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
_connectionString= builder.Build().GetValue<string>("Data:DefaultConnection:ConnectionString"); //this property exists as property of controller through DI, how can we access it?
}
}
过滤器中也可以进行依赖注入。
这是获取连接字符串的简单方法
public class EBisUserAuthResourceFilter : Attribute, IResourceFilter
{
private readonly string connectionString;
public EBisUserAuthResourceFilter(IConfiguration configuration)
{
this.connectionString = configuration
.GetSection("ConnectionStrings:DefaultConnection").Value;
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
// use this.connectionString
}
public void OnResourceExecuting(ResourceExecutingContext context)
{
// use this.connectionString
}
}
现在您可以使用这个过滤器了
[ServiceFilter(typeof(EBisUserAuthResourceFilter))]
public class HomeController : Controller
{ }
您还需要将此过滤器添加到服务集合中
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<EBisUserAuthResourceFilter>();
// your existing code to add other services
}
另一种解决方案是使用 class 表示 AppSettings.json
文件或子部分内容的结构,并将其加载到您的 Startup classes' ConfigureServices
方法
services.Configure<SiteSettings>(Configuration);
现在您可以注入 IOptions<SiteSettings>
并使用所需的 属性 值。我更喜欢这个,因为它在我的代码中 没有魔法字符串 。
我有一个控制器 EBisUserController,它包含一个 public 属性 通过依赖注入从 appsettings.json
获得的 ConnectionString。控制器有一个属性过滤器 'EBisUserAuthResourceFilter' 需要使用在控制器中找到的 属性 ConnectionString。访问 ConnectionString 的最高效方法是什么。我有一个我想要的工作示例,但知道这不是执行此操作的正确方法,因为它必须为每个事务打开和读取文件。
public class EBisUserAuthResourceFilter : Attribute, IResourceFilter {
private string _connectionString;
public EBisUserAuthResourceFilter() {
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
_connectionString= builder.Build().GetValue<string>("Data:DefaultConnection:ConnectionString"); //this property exists as property of controller through DI, how can we access it?
}
}
过滤器中也可以进行依赖注入。
这是获取连接字符串的简单方法
public class EBisUserAuthResourceFilter : Attribute, IResourceFilter
{
private readonly string connectionString;
public EBisUserAuthResourceFilter(IConfiguration configuration)
{
this.connectionString = configuration
.GetSection("ConnectionStrings:DefaultConnection").Value;
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
// use this.connectionString
}
public void OnResourceExecuting(ResourceExecutingContext context)
{
// use this.connectionString
}
}
现在您可以使用这个过滤器了
[ServiceFilter(typeof(EBisUserAuthResourceFilter))]
public class HomeController : Controller
{ }
您还需要将此过滤器添加到服务集合中
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<EBisUserAuthResourceFilter>();
// your existing code to add other services
}
另一种解决方案是使用 class 表示 AppSettings.json
文件或子部分内容的结构,并将其加载到您的 Startup classes' ConfigureServices
方法
services.Configure<SiteSettings>(Configuration);
现在您可以注入 IOptions<SiteSettings>
并使用所需的 属性 值。我更喜欢这个,因为它在我的代码中 没有魔法字符串 。