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.
// 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>();
}
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> { }
// 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"