我有一个Web服务,它在打开应用程序时将数据集返回给客户端桌面应用程序,不会将任何内容发送回数据库。 桌面应用程序需要此数据集的整个生命周期
将此数据集保留在内存中的最佳方法是什么,比如ASP.net中的缓存?
是否有可能将其保留为XML并在应用程序查找数据时将其恢复?
这是一个提供给客户端应用程序的产品列表,产品列表全局从Web应用程序更新,因此如果客户端需要最新数据,那么有从Web检索的方法,但基本上只有一次加载在启动期间应用程序并继续使用它但有9,000行我担心应用程序性能和内存,不确定9,000行数据集将消耗多少内存
非常感谢示例代码
答案 0 :(得分:1)
您想使用缓存旁边模式。
基本上,它提供了一种众所周知的方法来将具体对象放入缓存中......使用过期策略(不要重新发明轮子,使用可用的东西)。
模式说“给我缓存中的内容......如果它不在那里,这是真正的方法来填充对象”。
您可以在瘦客户端上运行以下代码,如果我有“新的ClaimsPrincipal”,您可以调用Web服务并获取所需的数据。
https://msdn.microsoft.com/en-us/library/dn589799.aspx
https://blog.cdemi.io/design-patterns-cache-aside-pattern/
以下是一个例子:
public class PrincipalMemoryCacheAside // : IPrincipalCacheAside
{
public const string CacheKeyPrefix = "PrincipalMemoryCacheAsideKey";
public ClaimsPrincipal GetTheClaimsPrincipal(string uniqueIdentifier)
{
string cacheKey = this.GetFullCacheKey(uniqueIdentifier);
ClaimsPrincipal cachedOrFreshPrincipal = GetFromCache<ClaimsPrincipal>(
cacheKey,
() =>
{
ClaimsPrincipal returnPrinc = null;
/* You would go hit your web service here to populate your object */
ClaimsIdentity ci = new GenericIdentity(this.GetType().ToString());
ci.AddClaim(new Claim("MyType", "MyValue"));
returnPrinc = new ClaimsPrincipal(ci);
return returnPrinc;
});
return cachedOrFreshPrincipal;
}
private TEntity GetFromCache<TEntity>(string key, Func<TEntity> valueFactory) where TEntity : class
{
ObjectCache cache = MemoryCache.Default;
//// the lazy class provides lazy initializtion which will evaluate the valueFactory expression only if the item does not exist in cache
var newValue = new Lazy<TEntity>(valueFactory);
CacheItemPolicy policy = new CacheItemPolicy { SlidingExpiration = new TimeSpan(0, 60, 0), Priority = CacheItemPriority.NotRemovable };
////The line below returns existing item or adds the new value if it doesn't exist
var value = cache.AddOrGetExisting(key, newValue, policy) as Lazy<TEntity>;
return (value ?? newValue).Value; // Lazy<T> handles the locking itself
}
private string GetFullCacheKey(string uniqueIdentifier)
{
string returnValue = CacheKeyPrefix + uniqueIdentifier;
return returnValue;
}
}