After adding System.Runtime.Caching assembly as the reference in your project, we can cache the data retrieved by a web services:
using System.Runtime.Caching; class CrmHelper{ static ObjectCache cache = MemoryCache.Default; //... string key = string.Format("{0}/{1}", "account", "address1_addresstypecode"); MetadataService service = new MetadataService(); service.Credentials = CredentialCache.DefaultCredentials; Option[] options = null; if (cache.Contains(key)){ options = (Option[])cache[key]; else { var picklist = (PicklistAttributeMetadata) service.RetrieveAttributeMetadata( "account", "address1_addresstypecode"); options = picklist.Options; cache.Set(key, options, new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(2) }); } //... }
if (cache.Contains(key)) ... cache.Set(key, data)
is going to be a repeating pattern. We could write an extension method to wrap it up:public static class Extensions { public static T Get<T>(this ObjectCache cache, string key, Func<T> retrieveFunction) { if (cache.Contains(key)) { return (T)cache[key]; } else { var result = retrieveFunction(); cache.Set(key, result, new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(2) }); return result; } } }The previous code is now cleaned up like this:
using System.Runtime.Caching; class CrmHelper{ static ObjectCache cache = MemoryCache.Default; //... string key = string.Format("{0}/{1}", "account", "address1_addresstypecode"); MetadataService service = new MetadataService(); service.Credentials = CredentialCache.DefaultCredentials; Option[] options = cache.Get(key, () => { var picklist = (PicklistAttributeMetadata) service.RetrieveAttributeMetadata( "account", "address1_addresstypecode"); return picklist.Options; }); //... }It is worth to note that the Cache Application Block from Enterprise Library is deprecating (http://msdn.microsoft.com/en-us/library/ff664753(v=PandP.50).aspx):
Caching Application Block functionality is built into .NET Framework 4.0; therefore the Enterprise Library Caching Application Block will be deprecated in releases after 5.0. You should consider using the .NET 4.0 System.Runtime.Caching classes instead of the Caching Application Block in future development.If you only want a quick memory cache, the new caching API might already fit your needs. However, Enterprise Library provides some other implementations of caching (e.g. database, file, etc). If you want something more fancy, Enterprise Library could be an alternative.
Refereces: