【问题标题】:How to get connection string from appsettings.json inside custom filter in .net core如何从.net核心的自定义过滤器中的appsettings.json获取连接字符串
【发布时间】:2017-10-31 18:29:52
【问题描述】:

我有一个控制器 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?
    }
}

【问题讨论】:

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


    【解决方案1】:

    过滤器中也可以进行依赖注入。

    这是获取连接字符串的简单方法

    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 文件或子部分的内容结构,并将其加载到 Startup 类的 ConfigureServices 方法中

    services.Configure<SiteSettings>(Configuration);
    

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

    【讨论】:

    • 最上面的例子,这对我来说是更可取的,因为我可能会经常修改 appsettings.json,以便进行以下修改:在 Startup.cs 的 ConfigureServices 方法中,我必须添加:@987654328 @
    • 是的。您需要这样做才能使过滤器可用
    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 2021-06-20
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多