Vulnerability in EPiServer.Forms

Try our conversational search powered by Generative AI!

smithsson68@gmail.com
Jan 15, 2010
  11402
(7 votes)

Using a DynamicDataStore instance correctly

I’ve recently seen a couple of examples of code where the Dynamic Data Store (being released as part of CMS 6) has been used in a multithreaded environment (web app for example) in a singleton pattern, i.e. a single instance of a DynamicDataStore is shared between all requests (read threads) in the application.

THIS IS BAD!

The default implementation (EPiServerDynamicDataStore) of the DynamicDataStore is not thread safe.

Let me just say that again

DYNAMIC DATA STORE IS NOT THREAD SAFE.

Think of it like an ADO.NET connection object:

- Obtain – Use – Throw Away

on the stack in a method.

The internals of the Dynamic Data Store are thread safe, that is all instances access shared data with thread synchronization. The cost of obtaining a DDS instance using the DynamicDataStoreFactory GetStore method is low due to all store metadata being cached in memory so there really is no need to hold DDS instances as member variables in a class.

An example of the recommended use pattern can be found below:

 

// Create and populate my object
Person p = new Person();
p.FirstName = "Micky";
p.LastName = "Mouse";

// Obtain a store instance
EPiServer.Data.Dynamic.DynamicDataStore store = GetStore(typeof(Person));

// save the object
store.Save(p);

static EPiServer.Data.Dynamic.DynamicDataStore GetStore(Type t)
{
  // GetStore will only return null the first time this method is called for a Type
  // In that case the ?? C# operator will call CreateStore
  return EPiServer.Data.Dynamic.DynamicDataStoreFactory.Instance.GetStore(t) ??
      EPiServer.Data.Dynamic.DynamicDataStoreFactory.Instance.CreateStore(t);
}
Jan 15, 2010

Comments

Jonathan Roberts
Jonathan Roberts Nov 20, 2014 06:28 PM

THis is great - can you get the data from the DDS when using a webservice? for example:

var store = DynamicDataStoreFactory.Instance.GetStore(typeof(CategoryItems));

var responses = from r in store.Items()
select r;

I use the exact code in a page and I get the data back but calling it from a webservice I get Zero items returned.

Jon

Please login to comment.
Latest blogs
Stop Managing Humans in Your CMS

Too many times, a content management system becomes a people management system. Meaning, an organization uses the CMS to manage all the information...

Deane Barker | Nov 30, 2023

A day in the life of an Optimizely Developer - Optimizely CMS 12: The advantages and considerations when exploring an upgrade

GRAHAM CARR - LEAD .NET DEVELOPER, 28 Nov 2023 In 2022, Optimizely released CMS 12 as part of its ongoing evolution of the platform to help provide...

Graham Carr | Nov 28, 2023

A day in the life of an Optimizely Developer - OptiUKNorth Meetup January 2024

It's time for another UK North Optimizely meet up! After the success of the last one, Ibrar Hussain (26) and Paul Gruffydd (Kin + Carta) will be...

Graham Carr | Nov 28, 2023

Publish content to Optimizely CMS using a custom GPT from OpenAI 🤖

Do you find the traditional editor interface complicated and cluttered? Would you like an editorial AI assistant you can chat with? You can!

Tomas Hensrud Gulla | Nov 28, 2023 | Syndicated blog