繁体   English   中英

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

[英]How To Get Configurable Cache Duration on Service Methods With ServiceStack?

我在服务中的一种 Get 方法上使用了CacheResponseAttribute ,例如[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 方法的装饰器。 但是,依赖注入似乎不适用于属性,因为我将配置设置为 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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM