如何从.net core中的自定义过滤器中的appsettings.json获取连接字符串

时间:2017-10-31 18:29:53

标签: asp.net asp.net-web-api asp.net-core asp.net-core-2.0

我有一个控制器EBisUserController,它包含一个通过依赖注入从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?
    }
}

1 个答案:

答案 0 :(得分:0)

过滤器也可以使用依赖注入。

这是获取连接字符串

的简单方法
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
}

另一个解决方案是让一个类表示AppSettings.json文件或子节的内容结构,并在启动类中加载ConfigureServices方法

services.Configure<SiteSettings>(Configuration);

现在您可以注入IOptions<SiteSettings>并使用所需的属性值。我更喜欢这个,因为我的代码中较少的魔术字符串