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 Git push error: "RPC failed; curl 56 HTTP/2 stream 7 was reset send-pack: unexpected disconnect while reading sideband packet fatal: the remote end hung up unexpectedly"

Problem Today I saw the following problem when I tried to push my changes to a Git server after doing some work for upgrading an Umbraco v7 project to v8.18.8.  Possible reasons After some investigations, it seems like this could be because of the following reasons; Git is not happy with the amount of changes that are being pushed into the server.  There are possible limitations on the server about the size/amount of files that you can push. Your internet connection is not good and stable enough. Your Git client's version is old. Solution options For me, the easiest option was connecting to another Wifi and trying again. Apparently, this option helped quite a few people, so it is worth giving it a try. Unfortunately, it didn't work for me. A bad internet connection wasn't an option for me either, as my internet is pretty fast (500 Mbps). Similarly, my Git client version was the latest version (git version 2.41.0.windows.3).  On StackOverflow, there were a lot of recommend...

How to fix "Microsoft SQL Error SQL71564: Error validating element [USERNAME]: The element [USERNAME] has been orphaned from its login and cannot be deployed."

I needed to export a database in BACPAC format today in order to restore it somewhere else, and I encountered the following error. To resolve this issue, I deleted all of the users mentioned in the error log. After successfully creating the BACPAC file, I used it to create a new database with no problems. Error: TITLE: Microsoft SQL Server Management Studio ------------------------------ One or more unsupported elements were found in the schema used as part of a data package. Error SQL71564: Error validating element [USER1]: The element [USER1] has been orphaned from its login and cannot be deployed. Error SQL71564: Error validating element [USER2]: The element [USER2] has been orphaned from its login and cannot be deployed. Error SQL71564: Error validating element [USER3]: The element [USER3] has been orphaned from its login and cannot be deployed. Error SQL71564: Error validating element [USER4]: The element [USER4] has been orphaned from its login and cannot be deployed. Error SQL71...

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();     ...