如何使用ServiceStack在服务方法上获得可配置的缓存持续时间



我在服务中的一个Get方法(如[CacheResponse(Duration = 60)](上使用CacheResponseAttribute。但我希望这个缓存持续时间来自配置文件,这样我就可以根据服务当前运行的环境(dev、prod等(将其设置为不同的

我知道我们不能在属性构造函数中使用非常量的参数。所以我打算做一些类似的事情

public class MyCacheResponseAttribute : CacheResponseAttribute
{
public IConfiguration Configuration { get; set; }
public CacheWidgetResponseAttribute()
{
int.TryParse(Configuration["cache_duration_in_secs"], out var cacheDuration);
Duration = cacheDuration;
}
}

并将其用作Get方法的装饰器。然而,依赖项注入似乎不适用于属性,因为我将Configuration设置为null。

我的返回类型是字符串,我尝试过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);
}
}

或者通过singleton解决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;
}
}

最新更新