Skip to content

This packaged is designed to add types that extend the new Umbraco v9+ event aggregator pattern, allowing application code that manages it's own caches to hook into core Umbraco events and invalidate or updated those caches triggered via a notification event.

License

Notifications You must be signed in to change notification settings

mroberts91/umbraco-cache-refresher

Repository files navigation

Build (main) Nuget (with prereleases) Umbraco Version Support GitHub last commit GitHub

CacheRefresher Logo Our.Umbraco.CacheRefresher

This package is designed to add types that extend the new Umbraco v9+ event aggregator pattern, allowing application code that manages it's own caches to hook into core Umbraco events and invalidate or updated those caches triggered via a notification event.

Adding to IUmbracoBuilder

// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddUmbraco(_env, _config)
        // Add the INotification and INotifiableCacheRefresher pair using the Umbraco builder
        .AddCacheRefresher<ContentTreeChangeNotification, TestNotifiableCacheRefresher>()
        // Add the INotification and INotifiableAsyncCacheRefresher pair using the Umbraco builder
        .AddAsyncCacheRefresher<ContentTreeChangeNotification, TestNotifiableAsyncCacheRefresher>();
}

Types Added

public interface INotifiableCacheRefresher<in TNotification> : INotificationHandler<TNotification> { }
public abstract class NotifiableCacheRefresher<TNotification> : INotifiableCacheRefresher<TNotification> { }
public abstract class ContentTreeChangedCacheRefresher : NotifiableCacheRefresher<ContentTreeChangeNotification> { }

public interface INotifiableAsyncCacheRefresher<in TNotification> : INotificationAsyncHandler<TNotification> { }
public abstract class NotifiableAsyncCacheRefresher<TNotification> : INotifiableAsyncCacheRefresher<TNotification> { }
public abstract class ContentTreeChangedAsyncCacheRefresher : NotifiableAsyncCacheRefresher<ContentTreeChangeNotification> { }

Usage

// Async, inheriting from the the base abstract refresher
internal sealed class TestAsyncCacheRefresher : NotifiableAsyncCacheRefresher<ContentTreeChangeNotification>
{
    private readonly ITestCache<CacheValue> _cache;

    public TestNotifiableCacheRefresher(ITestCache<CacheValue> cache)
    {
        _cache = cache;
    }

    protected override async Task OnNotificationReceivedAsync(ContentTreeChangeNotification notification, CancellationToken cancellationToken)
    {
        if (!(notification?.Changes is IEnumerable<TreeChange<IContent>> changes))
            return;

        IEnumerable<Task> tasks = changes.Select(tc => _cache.RemoveAsync(tc.Item.Id));
        await Task.WhenAll(tasks);
    }
}

// Sync, inheriting from the Contnet Changed abstract refresher
internal sealed class TestCacheRefresher : ContentTreeChangedCacheRefresher
{
    private readonly ITestCache<CacheValue> _cache;

    public TestCacheRefresher(ITestCache<CacheValue> cache)
    {
        _cache = cache;
    }

    protected override void ContentChanged(IContent content, TreeChangeTypes treeChangeType)
    {
        _cache.Remove(content.Id);
    }
}

"Icon made by ultimatearm from www.flaticon.com"

About

This packaged is designed to add types that extend the new Umbraco v9+ event aggregator pattern, allowing application code that manages it's own caches to hook into core Umbraco events and invalidate or updated those caches triggered via a notification event.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Languages