c# - 如何使用 ServiceStack 获取服务方法的可配置缓存持续时间?
问题描述
我正在使用CacheResponseAttribute
服务中的一种 Get 方法,例如[CacheResponse(Duration = 60)]
. 但我希望此缓存持续时间来自配置文件,因此我可以根据服务当前运行的环境(开发、产品等)将其设置为不同
我知道我们不能在属性构造函数中使用非常量作为参数。所以我打算做类似的事情
public class MyCacheResponseAttribute : CacheResponseAttribute
{
public IConfiguration Configuration { get; set; }
public CacheWidgetResponseAttribute()
{
int.TryParse(Configuration["cache_duration_in_secs"], out var cacheDuration);
Duration = cacheDuration;
}
}
并将其用作 Get 方法的装饰器。但是,依赖注入似乎不适用于属性,因为我将配置设置为空。
我的返回类型是字符串,我试过 ToOptimizedResultUsingCache 但我无法让它正确返回字符串。
我有什么选择?是否有可能使 IoC 以某种方式在属性上工作?我想作为最后的手段,我可以ICacheClient
在服务中使用它并使用它,但这将是我的最后手段,因为它会更加定制。
解决方案
请求过滤器属性确实具有从 IOC 自动装配的属性,但这只能在执行对象构造函数之后发生,而不是之前。
因此,您可以在执行属性之前从注入的 IOC 属性中读取数据,例如:
public class MyCacheResponseAttribute : CacheResponseAttribute
{
public IConfiguration Configuration { get; set; }
public override Task ExecuteAsync(IRequest req, IResponse res, object requestDto)
{
if (Duration == default
&& int.TryParse(Configuration["cache_duration_in_secs"], out var duration))
Duration = duration;
return base.ExecuteAsync(req, res, requestDto);
}
}
或者通过单例解决 IOC 依赖关系,例如:
public class MyCacheResponseAttribute : CacheResponseAttribute
{
public MyCacheResponseAttribute()
{
var config = HostContext.Resolve<IConfiguration>();
if (int.TryParse(config["cache_duration_in_secs"], out var duration))
Duration = duration;
}
}
推荐阅读
- node.js - NestJS CSRF 用于特定的控制器路由
- javascript - JavaScript 音频网络 APN
- r - 使用 image() 函数创建显示基因表达的热图
- java - RxJava:合并不同线程上的可观察对象
- python - Pyppeteer 用于级联下拉框?
- python - 计算大小写的个数
- regex - 使用powershell重新排列文件名中的日期部分
- javascript - 为什么在下面的代码中我无法在 javascript 中使用点符号打印 return 语句
- javascript - 将从 api 接收到的数据格式化为数组 React Axios
- php - 如何根据想要在php中循环文本框的用户创建字段集