我有一个控制器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?
}
}
答案 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>
并使用所需的属性值。我更喜欢这个,因为我的代码中较少的魔术字符串。