如何使用 ServiceStack 在服务方法上获取可配置的缓存持续时间?
How To Get Configurable Cache Duration on Service Methods With ServiceStack?
我在 [CacheResponse(Duration = 60)]
等服务中的一种 Get 方法上使用了 CacheResponseAttribute
。但是我希望这个缓存持续时间来自配置文件,所以我可以根据服务当前 运行 在(开发、生产等)
上的环境将其设置为不同
我知道我们不能在属性构造函数中使用不常量的参数作为参数。所以我打算做一些像
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。
我的 return 类型是字符串,我试过 ToOptimizedResultUsingCache 但我无法正确地将其转换为 return 字符串。
我有什么选择?是否有可能以某种方式使 IoC 在属性上工作?我想作为最后的手段,我可以在服务中使用 ICacheClient
并使用它,但那将是我的最后手段,因为它会更加定制化。
请求 Filter Attributes 确实从 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;
}
}
我在 [CacheResponse(Duration = 60)]
等服务中的一种 Get 方法上使用了 CacheResponseAttribute
。但是我希望这个缓存持续时间来自配置文件,所以我可以根据服务当前 运行 在(开发、生产等)
我知道我们不能在属性构造函数中使用不常量的参数作为参数。所以我打算做一些像
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。
我的 return 类型是字符串,我试过 ToOptimizedResultUsingCache 但我无法正确地将其转换为 return 字符串。
我有什么选择?是否有可能以某种方式使 IoC 在属性上工作?我想作为最后的手段,我可以在服务中使用 ICacheClient
并使用它,但那将是我的最后手段,因为它会更加定制化。
请求 Filter Attributes 确实从 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;
}
}