Browse Source

Added caching for the LocalizedTemplateContentReaderFactory.

pull/3792/head
Halil İbrahim Kalkan 7 years ago
parent
commit
f75e7baef6
  1. 41
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs

41
framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs

@ -1,4 +1,7 @@
using System.Collections.Generic;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.VirtualFileSystem;
@ -8,18 +11,48 @@ namespace Volo.Abp.TextTemplating.VirtualFiles
public class LocalizedTemplateContentReaderFactory : ILocalizedTemplateContentReaderFactory, ISingletonDependency
{
private readonly IVirtualFileProvider _virtualFileProvider;
private readonly Dictionary<string, ILocalizedTemplateContentReader> _readerCache;
private readonly ReaderWriterLockSlim _lock;
public LocalizedTemplateContentReaderFactory(IVirtualFileProvider virtualFileProvider)
{
_virtualFileProvider = virtualFileProvider;
_readerCache = new Dictionary<string, ILocalizedTemplateContentReader>();
_lock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
}
public Task<ILocalizedTemplateContentReader> CreateAsync(TemplateDefinition templateDefinition)
public async Task<ILocalizedTemplateContentReader> CreateAsync(TemplateDefinition templateDefinition)
{
return CreateLocalizedReader(templateDefinition);
_lock.EnterUpgradeableReadLock();
try
{
var reader = _readerCache.GetOrDefault(templateDefinition.Name);
if (reader != null)
{
return reader;
}
_lock.EnterWriteLock();
try
{
reader = await CreateInternalAsync(templateDefinition);
_readerCache[templateDefinition.Name] = reader;
return reader;
}
finally
{
_lock.ExitWriteLock();
}
}
finally
{
_lock.ExitUpgradeableReadLock();
}
}
protected async Task<ILocalizedTemplateContentReader> CreateLocalizedReader(
protected virtual async Task<ILocalizedTemplateContentReader> CreateInternalAsync(
TemplateDefinition templateDefinition)
{
var virtualPath = templateDefinition

Loading…
Cancel
Save