当我测试对Servicestack服务的更改时,比如说使用浏览器界面时,我会不断地烧着自己。我没有看到我的新更改,原来是因为数据被缓存了。所以我清理了缓存,一切都很好。
我想知道是否有人以某种方式在他们的缓存密钥中包含了构建/版本号,或者可能在部署过程中做了一些事情来清除缓存。
我通常只会在响应DTO中嵌入一个Created
DateTime,其中包含创建和缓存响应DTO的Utc日期。我通常还会在请求DTO中包含一个Reload
标志,以指示是否要强制使用新的缓存。
你可以在TechStacks example中找到一个例子,例如:
[Route("/techstacks/{Slug}", Verbs = "GET")]
public class GetTechnologyStack : IReturn<GetTechnologyStackResponse>
{
public bool Reload { get; set; }
public string Slug { get; set; }
}
public class GetTechnologyStackResponse
{
public DateTime Created { get; set; }
public TechStackDetails Result { get; set; }
public ResponseStatus ResponseStatus { get; set; }
}
一个基本的实现看起来像:
public object Get(GetTechnologyStack request)
{
var key = "{0}/{1}".Fmt(request.GetType().Name,request.Slug);
if (request.Reload)
Cache.Remove(key);
return base.Request.ToOptimizedResultUsingCache(Cache, key, () =>
{
//...
return new GetTechnologyStackResponse {
Created = DateTime.UtcNow,
Result = result,
};
});
}
您的答案很好,但它需要更改Inbound和Outbound DTO,并向服务的最终用户公开一个他可能不关心的参数(因为这更像是一个实现细节)。我希望有一个完全内在的东西。
我最终确保我的AssemblyVersion属性设置为更改每个版本的修订/内部版本号:
[assembly: AssemblyVersion("1.0.*")]
然后,我创建了以下助手类,将版本号作为字符串提取出来:
internal class AssemblyVersion
{
public static string Version
{
get
{
return Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
}
}
最后,我将版本号添加到每个入站DTO的Cachekey属性中。现在,DLL版本号作为Cache键的一部分存储,DLL的新版本确保不使用旧版本的缓存项。
[DataContract]
[Route("/cachedhello/{Name}")]
public class CachedHello : IReturn<string>
{
[DataMember]
public string Name { get; set; }
public string CacheKey
{
get
{
return string.Format("urn:cachedhello:nm={0}:ver={1}", Name, AssemblyVersion.Version);
}
}
}