Browse Source

Merge pull request #17876 from abpframework/auto-merge/rel-7-4/2227

Merge branch dev with rel-7.4
pull/17882/head
maliming 3 years ago
committed by GitHub
parent
commit
911343d555
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 17
      framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/DefaultAbpCompiledViewProvider.cs
  2. 12
      framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderingEngine.cs

17
framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/DefaultAbpCompiledViewProvider.cs

@ -4,17 +4,20 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language;
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
namespace Volo.Abp.TextTemplating.Razor; namespace Volo.Abp.TextTemplating.Razor;
public class DefaultAbpCompiledViewProvider : IAbpCompiledViewProvider, ITransientDependency public class DefaultAbpCompiledViewProvider : IAbpCompiledViewProvider, ITransientDependency
{ {
private static readonly ConcurrentDictionary<string, Assembly> CachedAssembles = new ConcurrentDictionary<string, Assembly>(); private readonly static ConcurrentDictionary<string, Assembly> CachedAssembles = new ConcurrentDictionary<string, Assembly>();
private readonly static SemaphoreSlim SemaphoreSlim = new SemaphoreSlim(1, 1);
private readonly AbpCompiledViewProviderOptions _options; private readonly AbpCompiledViewProviderOptions _options;
private readonly AbpRazorTemplateCSharpCompiler _razorTemplateCSharpCompiler; private readonly AbpRazorTemplateCSharpCompiler _razorTemplateCSharpCompiler;
@ -50,7 +53,17 @@ public class DefaultAbpCompiledViewProvider : IAbpCompiledViewProvider, ITransie
throw new AbpException($"Razor template content of {templateDefinition.Name} is null!"); throw new AbpException($"Razor template content of {templateDefinition.Name} is null!");
} }
return CachedAssembles.GetOrAdd((templateDefinition.Name + templateContent).ToMd5(), await CreateAssembly(templateContent)); using (await SemaphoreSlim.LockAsync())
{
var cacheKey = (templateDefinition.Name + templateContent).ToMd5();
if (CachedAssembles.TryGetValue(cacheKey, out var cachedAssemble))
{
return cachedAssemble;
}
var assemble = await CreateAssembly(templateContent);
CachedAssembles.TryAdd(cacheKey, assemble);
return assemble;
}
} }
protected virtual async Task<Stream> GetAssemblyStreamAsync(TemplateDefinition templateDefinition, string templateContent) protected virtual async Task<Stream> GetAssemblyStreamAsync(TemplateDefinition templateDefinition, string templateContent)

12
framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderingEngine.cs

@ -18,18 +18,15 @@ public class RazorTemplateRenderingEngine : TemplateRenderingEngineBase, ITransi
public override string Name => EngineName; public override string Name => EngineName;
protected readonly IServiceScopeFactory ServiceScopeFactory; protected readonly IServiceScopeFactory ServiceScopeFactory;
protected readonly IAbpCompiledViewProvider AbpCompiledViewProvider;
public RazorTemplateRenderingEngine( public RazorTemplateRenderingEngine(
IServiceScopeFactory serviceScopeFactory, IServiceScopeFactory serviceScopeFactory,
IAbpCompiledViewProvider abpCompiledViewProvider,
ITemplateDefinitionManager templateDefinitionManager, ITemplateDefinitionManager templateDefinitionManager,
ITemplateContentProvider templateContentProvider, ITemplateContentProvider templateContentProvider,
IStringLocalizerFactory stringLocalizerFactory) IStringLocalizerFactory stringLocalizerFactory)
: base(templateDefinitionManager, templateContentProvider, stringLocalizerFactory) : base(templateDefinitionManager, templateContentProvider, stringLocalizerFactory)
{ {
ServiceScopeFactory = serviceScopeFactory; ServiceScopeFactory = serviceScopeFactory;
AbpCompiledViewProvider = abpCompiledViewProvider;
} }
public override async Task<string> RenderAsync( public override async Task<string> RenderAsync(
@ -115,12 +112,13 @@ public class RazorTemplateRenderingEngine : TemplateRenderingEngineBase, ITransi
Dictionary<string, object> globalContext, Dictionary<string, object> globalContext,
object? model = null) object? model = null)
{ {
var assembly = await AbpCompiledViewProvider.GetAssemblyAsync(templateDefinition);
var templateType = assembly.GetType(AbpRazorTemplateConsts.TypeName)!;
var template = (IRazorTemplatePage)Activator.CreateInstance(templateType)!;
using (var scope = ServiceScopeFactory.CreateScope()) using (var scope = ServiceScopeFactory.CreateScope())
{ {
var compiledViewProvider = scope.ServiceProvider.GetRequiredService<IAbpCompiledViewProvider>();
var assembly = await compiledViewProvider.GetAssemblyAsync(templateDefinition);
var templateType = assembly.GetType(AbpRazorTemplateConsts.TypeName)!;
var template = (IRazorTemplatePage)Activator.CreateInstance(templateType)!;
var modelType = templateType var modelType = templateType
.GetInterfaces() .GetInterfaces()
.Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IRazorTemplatePage<>)) .Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IRazorTemplatePage<>))

Loading…
Cancel
Save