World is now on Opti ID! Learn more

Johan Björnfot
Feb 3, 2011
  3718
(0 votes)

Criterion implementation patterns

To implement a criterion to be used with the personalization concept introduced in CMS6R2 is pretty straightforward. There are however some guidelines to be aware of:

  • If you implement ICriterion.Subscribe and in the method set up an event handler for any event then you should implement ICriterion.Unsubscribe as well and in that implementation remove all event handlers that where setup in Subscribe.

The reason for this is to avoid getting “dangling” event handlers which cause both unwanted behavior (in meaning event handlers for unused/old criterions are still called) and “memory leakage” (old criteria instances cannot be garbage collected since they are rooted through the event handler).

The pattern for Subscribe/Unsubscribe is that Subscribe on each used criterion instance is not only called during initialization but also whenever a VisitorGroup containing the criterion is saved. During Save of a VisitorGroup the framework will first call Unsubscribe for all previous existing criteria's on that group. Then new criteria instances will be created for the group and Subscribe will be called on these instances.

 

  • Remember that IsMatch can be called several time during a request.

An obvious consequence of this is that the execution time for the call to IsMatch will affect the time for the web request. You should also avoid taking locks (or at least keep the scope to a minimum) inside the method since that would prevent requests from running in parallel.

If your criteria is dependent on some external resource (for example an external database) then you should take the scenario where the external resource is not accessible into consideration.

The purpose of this post is of course not to scare you from writing your own criteria's (that is something we encourage you to do) but to give you a guideline to successful criterion implementations! :-)

Feb 03, 2011

Comments

Please login to comment.
Latest blogs
Make Global Assets Site- and Language-Aware at Indexing Time

I had a support case the other day with a question around search on global assets on a multisite. This is the result of that investigation. This co...

dada | Jun 26, 2025

The remote server returned an error: (400) Bad Request – when configuring Azure Storage for an older Optimizely CMS site

How to fix a strange issue that occurred when I moved editor-uploaded files for some old Optimizely CMS 11 solutions to Azure Storage.

Tomas Hensrud Gulla | Jun 26, 2025 |

Enable Opal AI for your Optimizely products

Learn how to enable Opal AI, and meet your infinite workforce.

Tomas Hensrud Gulla | Jun 25, 2025 |

Deploying to Optimizely Frontend Hosting: A Practical Guide

Optimizely Frontend Hosting is a cloud-based solution for deploying headless frontend applications - currently supporting only Next.js projects. It...

Szymon Uryga | Jun 25, 2025

World on Opti ID

We're excited to announce that world.optimizely.com is now integrated with Opti ID! What does this mean for you? New Users:  You can now log in wit...

Patrick Lam | Jun 22, 2025

Avoid Scandinavian Letters in File Names in Optimizely CMS

Discover how Scandinavian letters in file names can break media in Optimizely CMS—and learn a simple code fix to automatically sanitize uploads for...

Henning Sjørbotten | Jun 19, 2025 |