private void Invalidate(ItemLevelCachePart part)
        {
            InitializeSettings(part);

            foreach (var settings in part.ItemLevelCacheSettings)
            {
                var displayType = settings.Key;

                switch (settings.Value.InvalidationAction)
                {
                case ItemLevelCacheInvalidationAction.Evict:

                    mCacheService.RemoveByTag(ItemLevelCacheTag.For(part, displayType));
                    break;

                case ItemLevelCacheInvalidationAction.PreRender:

                    var shape = mContentManager.BuildDisplay(part.ContentItem, displayType);
                    shape.BypassDonutTokenization = true;

                    var markup    = (string)mShapeDisplay.Display(shape);
                    var cacheItem = new ItemLevelCacheItem(markup);

                    mCacheService.RemoveByTag(ItemLevelCacheTag.For(part, displayType));

                    // Give the markup to the item-level cache service which will cache it if required.
                    mItemLevelCacheService.CacheItem(part.ContentItem, displayType, cacheItem);
                    break;
                }
            }
        }
        private void InitializeSettings(ItemLevelCachePart part)
        {
            part.CompositeCacheKeyProviders = mCompositeCacheKeyProviderList.OrderBy(p => p.Name);

            // Seed the definition dictionary based on the definition of the content type (if required).
            var contentTypeSettings = part.Settings.GetModel <Dictionary <string, ItemLevelCacheSettings> >(Constants.ContentTypeDefinitionSettingsKey);

            if (contentTypeSettings != null)
            {
                part.ItemLevelCacheSettings = part.ItemLevelCacheSettings
                                              .Where(kvp => !kvp.Value.InheritDefaultSettings) // Exclude any saved settings where they shouldn't override the default settings...
                                              .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
                                              .Merge(contentTypeSettings);                     // ...because the default settings will then be added in here.

                part.ContentTypeCacheSettings = contentTypeSettings;
            }

            var defaultSettings = new Dictionary <string, ItemLevelCacheSettings>()
            {
                { "Detail", new ItemLevelCacheSettings() }
            };

            // Always ensure there is at least one display type configured.
            if (!part.ItemLevelCacheSettings.Any())
            {
                part.ItemLevelCacheSettings = defaultSettings;
            }

            if (!part.ContentTypeCacheSettings.Any())
            {
                part.ContentTypeCacheSettings = defaultSettings;
            }


            PopulateCompositeCacheKeyProviders(part.ItemLevelCacheSettings);
            PopulateCompositeCacheKeyProviders(part.ContentTypeCacheSettings);
        }