Calling all developers! We invite you to provide your input on Feature Experimentation by completing this brief survey.

 

Daniel Ovaska
Feb 12, 2016
  3832
(1 votes)

Episerver performance–Part 2 Object Cache in a separate layer

Basic object caching example

Time to get our hand dirty and dig into some code. Let’s start with the basic example that is useful in most scenarios.

Let’s start out with an example repository of News or similar. Imagine that this one gets news from an external source and that it’s pretty slow. I also created a simple NewsItem class and a request and response object to pass parameters into the method.

Repository

Let's add som caching using EPiServers object cache with some default settings for cache time etc. I’ll leave out dependencies for now but I’ll add a reference to a masterkey which is simply a string. This will make it easy for me later to clear any cache that is related to news without clearing the rest of the cache.

CacheInRepository

That will do in most simple projects. I usually add a settings object to constructor that specify cache duration at least so it can be set in appSettings. I'll leave that as an exercise to the reader.

Adding control over cache to calling object

But what if you want some more control over what is cached and how long from the calling class (the controller or service layer). Let's add some parameters to the request and response to make it possible. I'll use an interface for this. A base class is also an idea but I do like my interfaces since it's easy to add multiple interfaces.

RequestResponseClassesWithCaching

There, now we can specify the CacheDuration etc easily from the calling class. If we want to grab data fresh from the data source it’s possible to use the variable GetFromCache which is useful for ScheduledJobs and displaying for editors etc. Let’s see the matching implementation of the repository.

CacheInRepositoryV2

Now that's quite some code for handling caching that isn't really related to what this object is supposed to do. Single responsibility principle starts ringing a few bells.

Create a caching layer with decorator pattern

Let's try to add this with a decorator pattern instead in a caching layer above the original repository. This is definitely optional but useful if you have lots of logic you don't want to mix with cross cutting concerns like caching. Let’s create a CachedNewsRepositoryDecorator

CacheInDecorator

This will keep the originally NewsRepository free of any ugly caching code. Let’s take a look at the cleaned version

NewsRepositoryWithCacheDecorator

Nice and small and to the point again. The bell from SRP stopped ringing. How do we chain them using IOC? Let’s try out the new decorator syntax

AddingCachedecoratorInIoC

There we go! A nice little separate caching layer that is easy to configure and turn on and off, a simple cohesive repository that only does what it should and some interfaces that can be easily reused for multiple repositories. Next blog in series will take it a step further for larger enterprise sites with plenty of repositories. And as usual, don't use a design pattern like decorator just because it's fun. Use it when you have an actual problem since it will also increase the complexity of the solution. Hope that helps someone new to caching.

Code well and prosper!

Feb 12, 2016

Comments

Arild Henrichsen
Arild Henrichsen Feb 17, 2016 09:03 AM

Good stuff, Daniel. BTW you should replace your images with actual embedded code.. 

Feb 22, 2016 06:13 PM

Thx! I agree :)

Please login to comment.
Latest blogs
Decimal numbers in Optimizely Graph

Storing prices as decimal numbers on a commerce website and planning to expose them through Optimizely Graph? It might not be as straightforward as...

Damian Smutek | Jan 23, 2025 | Syndicated blog

Find and delete non used media and blocks

On my new quest to play around with Blazor and MudBlazor I'm going back memory lane and porting some previously plugins. So this time up is my plug...

Per Nergård (MVP) | Jan 21, 2025

Optimizely Content Graph on mobile application

CG everywhere! I pull schema from our default index https://cg.optimizely.com/app/graphiql?auth=eBrGunULiC5TziTCtiOLEmov2LijBf30obh0KmhcBlyTktGZ in...

Cuong Nguyen Dinh | Jan 20, 2025

Image Analyzer with AI Assistant for Optimizely

The Smart Image Analyzer is a new feature in the Epicweb AI Assistant for Optimizely CMS that automates the management of image metadata, such as...

Luc Gosso (MVP) | Jan 16, 2025 | Syndicated blog

How to: create Decimal metafield with custom precision

If you are using catalog system, the way of creating metafields are easy – in fact, you can forget about “metafields”, all you should be using is t...

Quan Mai | Jan 16, 2025 | Syndicated blog

Level Up with Optimizely's Newly Relaunched Certifications!

We're thrilled to announce the relaunch of our Optimizely Certifications—designed to help partners, customers, and developers redefine what it mean...

Satata Satez | Jan 14, 2025