HomeDev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunitySubmit a ticketLog In
GitHubNuGetDev CommunitySubmit a ticket

Cache read-only objects

Describes read-only object caching, and how this type of caching works.

Most APIs in Optimizely CMS return read-only instances of objects, such as IContentLoader.Get<TContentData> which returns a read-only IContent instance.

To make changes to read-only instances, create a writable clone with the CreateWritableClone method, which has the following advantages:

  • Reduce memory consumption – Threads serving Web requests get the same instance of an object, effectively reducing the number of short-lived objects created.
  • Improve performance – Returning shared read-only instances offers better performance.
  • Cleaner architecture – This simplifies the implementation because you cannot change an instance of an object shared with other threads.

Classes that have the read-only support implements the IReadOnly<T> interface, which is defined as follows:

public interface IReadOnly {
  void MakeReadOnly();
  bool IsReadOnly {

public interface IReadOnly<T>: IReadOnly {
  T CreateWritableClone();

The lifecycle of a typical IContent instance is as follows:

  1. Create the IContent instance as mutable (which means writeable).
  2. Populate the IContent instance with property values.
  3. Call the IReadOnly.MakeReadOnly method to ensure that any contained objects are made read-only. The object is immutable for the remainder of its lifetime.
  4. Add the object to the cache.