Skip to main content

Cache Handler

Below is a CacheHandler that might be useful to store data in cache objects so rather than returning the data from db, we can return it from the Cache objects

// CacheHanlder.cs
using XYZProject.Infrastructure.Constants;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Caching;
using System.Web.Configuration;

namespace XYZProject.Infrastructure.EventHandlers
{
    public static class CacheHandler
    {
        /// <summary>
        /// Returns ExpirationMinutes from Web.config
        /// </summary>
        private static int ExpirationMinutes
        {
            get
            {
                return ToInt32(WebConfigurationManager.AppSettings["CacheExpirationMinutes"]);
            }
        }

        public static object GetValue(string key)
        {
            return HttpContext.Current.Cache[key];
        }

        public static void ClearCache(string key)
        {
            HttpContext.Current.Cache.Remove(key);
        }

        /// <summary>
        /// Clears all service cache for Profile and Framework service methods
        /// </summary>
        /// <param name="userGuid"></param>
        public static void ClearAllServiceCache(Guid userGuid)
        {
            List<string> getAllCacheKeyMembers = CacheConstants.GetAllCacheKeyMembers();
            foreach (string item in getAllCacheKeyMembers)
            {
                string key = item + userGuid;
                HttpContext.Current.Cache.Remove(key);
            }
        }

        /// <summary>
        /// Sets Cache Vaue with an Absolute Expiration
        /// If expirationMinutes is 0, then it gets the expirationMinutes value from the Web.config
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="expirationMinutes"></param>
        public static void SetValueWithAbsoluteExpiration(string key, object value, int expirationMinutes = 0)
        {
            if (expirationMinutes == 0)
            {
                expirationMinutes = ExpirationMinutes;
            }
            HttpContext.Current.Cache.Insert(key, value, null, DateTime.Now.AddMinutes(expirationMinutes), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
        }

        public static void SetValueWithNoExpiration(string Key, object value)
        {
            HttpContext.Current.Cache.Insert(Key, value);
        }

        #region [ Int Converter ]

        private static bool Assigned(this object o)
        {
            if (o is string)
                return !string.IsNullOrEmpty((string)o);

            return (o != null);
        }

        public static Int32 ToInt32(object value, Int32 defaultValue)
        {
            Int32 retVal = defaultValue;
            if (value.Assigned())
            {
                Int32.TryParse(Convert.ToString(value), out retVal);
            }

            return retVal;
        }

        public static Int32 ToInt32(object value)
        {
            return ToInt32(value, 0);
        }

        #endregion
    }
}



// CacheConstants.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace XYZProject.Infrastructure.Constants
{
    public static class CacheConstants
    {
        public static class ProfileServiceCacheKeyMember
        {
            public const string GetProfileViewModelAsync = "GetProfileViewModelAsync_";
            public const string GetSkillsAsync = "GetSkillsAsync_";
            public const string GetProfileAsync = "GetProfileAsync_";
            public const string GetProfileModelAsync = "GetProfileModelAsync_";
            public const string GetPreferencesAsync = "GetPreferencesAsync_";
            public const string GetNonCertifiedQualificationsAsync = "GetNonCertifiedQualificationsAsync_";
            public const string GetPhotoAsync = "GetPhotoAsync_";
            public const string GetInterestsAsync = "GetInterestsAsync_";
            public const string GetAboutMeAsync = "GetAboutMeAsync_";
            public const string GetAccessLevelsAsync = "GetAccessLevelsAsync_";
            public const string GetAwardsAsync = "GetAwardsAsync_";
            public const string GetContactDetailsAsync = "GetContactDetailsAsync_";
            public const string GetCurriculumInterestsAsync = "GetCurriculumInterestsAsync_";
            public const string GetNationalitiesAsync = "GetNationalitiesAsync_";
            public const string GetEthnicitiesAsync = "GetEthnicitiesAsync_";
            public const string GetGendersAsync = "GetGendersAsync_";
        }

        public static class FrameworkServiceCacheKeyMember
        {
            public const string GetProgrammeRegistrationsAsync = "GetProgrammeRegistrationsAsync_";
            public const string GetComponentProgrammesAsync = "GetComponentProgrammesAsync_";
            public const string GetEventProgrammesAsync = "GetEventProgrammesAsync_";
            public const string GetEventRegistrationAsync = "GetEventRegistrationAsync_";
            public const string GetEventRegistrationsAsync = "GetEventRegistrationsAsync_";
            public const string GetEventStructureAsync = "GetEventStructureAsync_";
            public const string GetEvidenceAsync = "GetEvidenceAsync_";
            public const string GetEvidencesAsync = "GetEvidencesAsync_";
            public const string GetProgrammeProgrammesAsync = "GetProgrammeProgrammesAsync_";
            public const string GetProgrammeStructureAsync = "GetProgrammeStructureAsync_";
        }

        public static List<string> GetAllCacheKeyMembers()
        {
            List<string> cacheKeyMembers = new List<string>();

            Type typeProfileServiceCacheKeyMember = typeof(ProfileServiceCacheKeyMember);

            foreach (var p in typeProfileServiceCacheKeyMember.GetFields())
            {
                var v = p.GetValue(null); //static classes cannot be instanced, so use null...
                cacheKeyMembers.Add(v.ToString());
            }

            Type typeFrameworkServiceCacheKeyMember = typeof(FrameworkServiceCacheKeyMember);

            foreach (var p in typeFrameworkServiceCacheKeyMember.GetFields())
            {
                var v = p.GetValue(null); //static classes cannot be instanced, so use null...
                cacheKeyMembers.Add(v.ToString());
            }

            return cacheKeyMembers.Distinct().ToList();
        }
    }
}


Comments

Popular posts from this blog

How to fix Umbraco v9 "Boot Failed : Umbraco failed to boot, if you are the owner of the website please see the log file for more details." error

If you have started working with Umbraco v9 and done your first Azure deployment to one of your testing environments, there is a possibility that you might see the following "Boot Failed" error. Error: Checking the logs In order to understand the problem, you should check the Umbarco log file.  The default location for this file is umbraco/Logs and this file contains the Machine name, along with the date information. You can reach this file via Azure's Kudu Service  or alternatively, you can get download your Azure App Service's publish profile and connect your App Service via an FTP application, i.e. FileZilla. See the FileZilla screen below; Once you get your log file, you can download it to your local machine and open it with a text editor, i.e. Notepad++. When you open it, you will see all logs, including the error message. Please be aware, as most things with Umbraco, logging is also customizable, so you can either use the default Umbraco logging which is Micros

How to use JQuery Ajax Methods for Async ASP.NET MVC Action Methods

Making repeatedly calls to async methods can be a nightmare. In this case, it makes sense to use 2 ajax methods, instead of one. Here is a simple solution to overcome this problem. See that  ajaxcalls   is emptied after the success response for the first ajax call and then the second ajax method is used to make one single call to the async action method. Hope it helps. View: @section Scripts{     < script type ="text/javascript">         var smartDebitObject = new Object();         smartDebitObject.MembershipNumber = $( "#MembershipNumber" ).val();         smartDebitObject.ProfileId = $( "#ProfileId" ).val();         smartDebitObject.FirstName = $( "#FirstName" ).val();         smartDebitObject.LastName = $( "#LastName" ).val();         smartDebitObject.AddressLine1 = $( "#AddressLine1" ).val();         smartDebitObject.Postcode = $( "#Postcode" ).val();         smartDebitObject

Umbraco lifehack: How to setup anchor/jump links in Umbraco without making code changes

Today one of my clients created a ticket asking whether it is possible to set up anchor/jump links for an Umbraco content page so that they could link different sections of the page together. This is a common scenario for most Content editors and it should be super easy with any CMS platform, right? Houston, we got a problem! Now an anchor or page jump link is a special URL that takes you to a specific place on a page and it normally requires a unique HTML element ID to link different parts of a page.  When I investigated my issue, I realised that the page sections of the Umbraco page didn't have unique IDs.  View Source Code comes to the rescue In order to resolve the issue without any code changes, I decided to update the content using the built-in View Source Code feature of Umbraco CMS. This feature is available on built-in property editors, like Rich Text Editor and is super handy for checking the code that Umbraco generates for your Front-end website and making minor adju