dotnetnoob
dotnetnoob

Reputation: 11330

Reference to cache object

I'm using .NET C# for a project.

I have a list of products which I want to cache as they're used company wide. If the products drop out of cache I already know how to lock the cache and rebuild it ok as per the patterns on various authority/blog sites.

In my pages/user controls etc, I might grab a reference to the cache, like this:

var myCacheInstance = cachedProducts

However, I might also want to do something like this:

myCacheInstance.Add(new product(...));

Which will also update the cache as it's the same object.

I have 2 queries.

  1. If I have a reference to the cached object is it guaranteed to remain in cache for the lifetime of my variable?
  2. In the scanario outlined above, how do I go about ensuring integrity? I'm only planning on adding in this instance, but suppose, I was updating and deleting objects as well?

Upvotes: 0

Views: 2168

Answers (3)

flayn
flayn

Reputation: 5322

Do not pass around a reference to your cache!

Use an object for your cache and if a clients wants to have the cached items return a new list of your cached items, or a readonly collection. If you want to add items to the cache, use a method on the cache object and in that method lock the cache and add the item. Same with remove.

question 1: If you pass around references you can not guarantee anything. question 2: Use an object to cache all your items as I described above.

public class Cache
{
  private List<Item> cachedItems = new List<Item>();

  public void Add(Item item)
  {
   lock(cachedItems)
   {
    cachedItems.Add(item);
   }
  }
}

Upvotes: 1

Aghilas Yakoub
Aghilas Yakoub

Reputation: 28970

hello in order to ensure integrity, you must add key

Cache.Add("YourKey", yourValue)

here you can find helper for all operations

http://johnnycoder.com/blog/2008/12/10/c-cache-helper-class/

For duration or timeout you have this format, where you specify absoluteExpiration

public Object Add (string key, Object value, CacheDependency dependencies, 
DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority
priority, CacheItemRemovedCallback onRemoveCallback) 

Upvotes: 0

Tigran
Tigran

Reputation: 62256

1) If I have a reference to the cached object is it guaranteed to remain in cache for the lifetime of my variable?

If I right interpret this question: responce is no.

cache.Add("key", new object()); // ADD KEY
var obj = cache["key"];         // GET REFERENCE TO CACHED OBJECT
cache.Remove("key");            // REMOVE OBJECT FROM CACHE

obj.DoSomething(..);            //PERFECTLY VALID, STILL WORK ..

2) In the scanario outlined above, how do I go about ensuring integrity? I'm only planning on adding in this instance, but suppose, I was updating and deleting objects as well?

Can add bool property like, for example:

public bool IsValid
{
    get; private set;
}

when object removed this property is set from the class to false. Just example, iff it really fits your need can tell us only you.

Upvotes: 1

Related Questions