Browse Source

Supports the use of multiple template rendering engines in one application.

Resolve #8651
pull/8673/head
maliming 6 years ago
parent
commit
765d836c75
  1. 33
      framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTemplateRendererProviderOptions.cs
  2. 27
      framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateRendererProvider.cs
  3. 14
      framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinition.cs
  4. 42
      framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateRendererProviderBase.cs
  5. 8
      framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/AbpTextTemplatingRazorModule.cs
  6. 40
      framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider.cs
  7. 8
      framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/AbpTextTemplatingScribanModule.cs
  8. 34
      framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider.cs
  9. 1
      framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj
  10. 53
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TextTemplating/AbpTemplateRenderer.cs
  11. 5
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TextTemplating/AbpTextTemplatingModule.cs
  12. 1
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj
  13. 4
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorLocalizedTemplateContentReaderFactory_Tests.cs
  14. 4
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider_Tests.cs
  15. 12
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTestTemplateDefinitionProvider.cs
  16. 1
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTextTemplatingTestModule.cs
  17. 6
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorVirtualFileTemplateContributor_Tests.cs
  18. 2
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml
  19. 2
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml
  20. 2
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/en.cshtml
  21. 2
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/tr.cshtml
  22. 3
      framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj
  23. 4
      framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider_Tests.cs
  24. 12
      framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTestTemplateDefinitionProvider.cs
  25. 1
      framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTextTemplatingTestModule.cs
  26. 10
      framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj
  27. 16
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs
  28. 46
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/HybridTemplateRendererProvider_Tests.cs
  29. 2
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestRazorTemplate.cshtml
  30. 1
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestScribanTemplate.tpl
  31. 22
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs
  32. 5
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplates.cs

33
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTemplateRendererProviderOptions.cs

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
namespace Volo.Abp.TextTemplating
{
public class AbpTemplateRendererProviderOptions
{
protected IDictionary<string, Type> Providers { get; }
public AbpTemplateRendererProviderOptions()
{
Providers = new Dictionary<string, Type>();
}
public AbpTemplateRendererProviderOptions AddProvider<TProvider>(string templateRenderEngineName)
where TProvider : ITemplateRendererProvider
{
if (Providers.ContainsKey(templateRenderEngineName))
{
Providers.RemoveAll(x => x.Key == templateRenderEngineName);
}
Providers[templateRenderEngineName] = typeof(TProvider);
return this;
}
public Type GetProviderTypeOrNull(string templateRenderEngineName)
{
return templateRenderEngineName == null ? null : Providers.GetOrDefault(templateRenderEngineName);
}
}
}

27
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateRendererProvider.cs

@ -0,0 +1,27 @@
using System.Collections.Generic;
using System.Globalization;
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.TextTemplating
{
public interface ITemplateRendererProvider
{
string Name { get; }
/// <summary>
/// Renders a text template.
/// </summary>
/// <param name="templateName">The template name</param>
/// <param name="model">An optional model object that is used in the template</param>
/// <param name="cultureName">Culture name. Uses the <see cref="CultureInfo.CurrentUICulture"/> if not specified</param>
/// <param name="globalContext">A dictionary which can be used to import global objects to the template</param>
/// <returns></returns>
Task<string> RenderAsync(
[NotNull] string templateName,
[CanBeNull] object model = null,
[CanBeNull] string cultureName = null,
[CanBeNull] Dictionary<string, object> globalContext = null
);
}
}

14
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinition.cs

@ -37,6 +37,9 @@ namespace Volo.Abp.TextTemplating
[CanBeNull]
public string DefaultCultureName { get; }
[CanBeNull]
public string RenderEngine { get; protected set; }
/// <summary>
/// Gets/sets a key-value on the <see cref="Properties"/>.
/// </summary>
@ -84,5 +87,14 @@ namespace Volo.Abp.TextTemplating
Properties[key] = value;
return this;
}
/// <summary>
/// Sets the Render Engine of <see cref="TemplateDefinition"/>.
/// </summary>
public virtual TemplateDefinition WithRenderEngine(string renderEngine)
{
RenderEngine = renderEngine;
return this;
}
}
}
}

42
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateRendererProviderBase.cs

@ -0,0 +1,42 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
namespace Volo.Abp.TextTemplating
{
public abstract class TemplateRendererProviderBase : ITemplateRendererProvider
{
public abstract string Name { get; }
protected readonly ITemplateDefinitionManager TemplateDefinitionManager;
protected readonly ITemplateContentProvider TemplateContentProvider;
protected readonly IStringLocalizerFactory StringLocalizerFactory;
public TemplateRendererProviderBase(
ITemplateDefinitionManager templateDefinitionManager,
ITemplateContentProvider templateContentProvider,
IStringLocalizerFactory stringLocalizerFactory)
{
TemplateDefinitionManager = templateDefinitionManager;
TemplateContentProvider = templateContentProvider;
StringLocalizerFactory = stringLocalizerFactory;
}
public abstract Task<string> RenderAsync(string templateName, object model = null, string cultureName = null, Dictionary<string, object> globalContext = null);
protected virtual async Task<string> GetContentOrNullAsync(TemplateDefinition templateDefinition)
{
return await TemplateContentProvider.GetContentOrNullAsync(templateDefinition);
}
protected virtual IStringLocalizer GetLocalizerOrNull(TemplateDefinition templateDefinition)
{
if (templateDefinition.LocalizationResource != null)
{
return StringLocalizerFactory.Create(templateDefinition.LocalizationResource);
}
return StringLocalizerFactory.CreateDefaultOrNull();
}
}
}

8
framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/AbpTextTemplatingRazorModule.cs

@ -7,6 +7,12 @@ namespace Volo.Abp.TextTemplating.Razor
)]
public class AbpTextTemplatingRazorModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpTemplateRendererProviderOptions>(options =>
{
options.AddProvider<RazorTemplateRendererProvider>(RazorTemplateRendererProvider.ProviderName);
});
}
}
}

40
framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer.cs → framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider.cs

@ -12,27 +12,27 @@ using Volo.Abp.Localization;
namespace Volo.Abp.TextTemplating.Razor
{
[Dependency(ReplaceServices = true)]
public class RazorTemplateRenderer : ITemplateRenderer, ITransientDependency
public class RazorTemplateRendererProvider : TemplateRendererProviderBase, ITransientDependency
{
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly IAbpCompiledViewProvider _abpCompiledViewProvider;
private readonly ITemplateDefinitionManager _templateDefinitionManager;
private readonly IStringLocalizerFactory _stringLocalizerFactory;
public const string ProviderName = "Razor";
public override string Name => ProviderName;
public RazorTemplateRenderer(
protected readonly IServiceScopeFactory ServiceScopeFactory;
protected readonly IAbpCompiledViewProvider AbpCompiledViewProvider;
public RazorTemplateRendererProvider(
IServiceScopeFactory serviceScopeFactory,
IAbpCompiledViewProvider abpCompiledViewProvider,
ITemplateDefinitionManager templateDefinitionManager,
ITemplateContentProvider templateContentProvider,
IStringLocalizerFactory stringLocalizerFactory)
: base(templateDefinitionManager, templateContentProvider, stringLocalizerFactory)
{
_serviceScopeFactory = serviceScopeFactory;
_templateDefinitionManager = templateDefinitionManager;
_stringLocalizerFactory = stringLocalizerFactory;
_abpCompiledViewProvider = abpCompiledViewProvider;
ServiceScopeFactory = serviceScopeFactory;
AbpCompiledViewProvider = abpCompiledViewProvider;
}
public virtual async Task<string> RenderAsync(
public override async Task<string> RenderAsync(
[NotNull] string templateName,
[CanBeNull] object model = null,
[CanBeNull] string cultureName = null,
@ -74,7 +74,7 @@ namespace Volo.Abp.TextTemplating.Razor
Dictionary<string, object> globalContext,
object model = null)
{
var templateDefinition = _templateDefinitionManager.Get(templateName);
var templateDefinition = TemplateDefinitionManager.Get(templateName);
var renderedContent = await RenderSingleTemplateAsync(
templateDefinition,
@ -115,11 +115,11 @@ namespace Volo.Abp.TextTemplating.Razor
Dictionary<string, object> globalContext,
object model = null)
{
var assembly = await _abpCompiledViewProvider.GetAssemblyAsync(templateDefinition);
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 modelType = templateType
.GetInterfaces()
@ -154,15 +154,5 @@ namespace Volo.Abp.TextTemplating.Razor
razorTemplatePageWithModel.Model = (TModel)model;
}
}
private IStringLocalizer GetLocalizerOrNull(TemplateDefinition templateDefinition)
{
if (templateDefinition.LocalizationResource != null)
{
return _stringLocalizerFactory.Create(templateDefinition.LocalizationResource);
}
return _stringLocalizerFactory.CreateDefaultOrNull();
}
}
}

8
framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/AbpTextTemplatingScribanModule.cs

@ -7,6 +7,12 @@ namespace Volo.Abp.TextTemplating.Scriban
)]
public class AbpTextTemplatingScribanModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpTemplateRendererProviderOptions>(options =>
{
options.AddProvider<ScribanTemplateRendererProvider>(ScribanTemplateRendererProvider.ProviderName);
});
}
}
}

34
framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer.cs → framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider.cs

@ -9,23 +9,20 @@ using Volo.Abp.Localization;
namespace Volo.Abp.TextTemplating.Scriban
{
public class ScribanTemplateRenderer : ITemplateRenderer, ITransientDependency
public class ScribanTemplateRendererProvider : TemplateRendererProviderBase, ITransientDependency
{
private readonly ITemplateContentProvider _templateContentProvider;
private readonly ITemplateDefinitionManager _templateDefinitionManager;
private readonly IStringLocalizerFactory _stringLocalizerFactory;
public const string ProviderName = "Scriban";
public override string Name => ProviderName;
public ScribanTemplateRenderer(
ITemplateContentProvider templateContentProvider,
public ScribanTemplateRendererProvider(
ITemplateDefinitionManager templateDefinitionManager,
ITemplateContentProvider templateContentProvider,
IStringLocalizerFactory stringLocalizerFactory)
: base(templateDefinitionManager, templateContentProvider, stringLocalizerFactory)
{
_templateContentProvider = templateContentProvider;
_templateDefinitionManager = templateDefinitionManager;
_stringLocalizerFactory = stringLocalizerFactory;
}
public virtual async Task<string> RenderAsync(
public override async Task<string> RenderAsync(
[NotNull] string templateName,
[CanBeNull] object model = null,
[CanBeNull] string cultureName = null,
@ -64,7 +61,7 @@ namespace Volo.Abp.TextTemplating.Scriban
Dictionary<string, object> globalContext,
object model = null)
{
var templateDefinition = _templateDefinitionManager.Get(templateName);
var templateDefinition = TemplateDefinitionManager.Get(templateName);
var renderedContent = await RenderSingleTemplateAsync(
templateDefinition,
@ -89,10 +86,7 @@ namespace Volo.Abp.TextTemplating.Scriban
Dictionary<string, object> globalContext,
object model = null)
{
var rawTemplateContent = await _templateContentProvider
.GetContentOrNullAsync(
templateDefinition
);
var rawTemplateContent = await GetContentOrNullAsync(templateDefinition);
return await RenderTemplateContentWithScribanAsync(
templateDefinition,
@ -146,15 +140,5 @@ namespace Volo.Abp.TextTemplating.Scriban
return context;
}
private IStringLocalizer GetLocalizerOrNull(TemplateDefinition templateDefinition)
{
if (templateDefinition.LocalizationResource != null)
{
return _stringLocalizerFactory.Create(templateDefinition.LocalizationResource);
}
return _stringLocalizerFactory.CreateDefaultOrNull();
}
}
}

1
framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj

@ -10,6 +10,7 @@
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.TextTemplating.Scriban\Volo.Abp.TextTemplating.Scriban.csproj" />
<ProjectReference Include="..\Volo.Abp.TextTemplating.Razor\Volo.Abp.TextTemplating.Razor.csproj" />
</ItemGroup>
</Project>

53
framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TextTemplating/AbpTemplateRenderer.cs

@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating.Scriban;
namespace Volo.Abp.TextTemplating
{
public class AbpTemplateRenderer : ITemplateRenderer, ITransientDependency
{
protected IServiceProvider ServiceProvider { get; }
protected ITemplateDefinitionManager TemplateDefinitionManager { get; }
protected AbpTemplateRendererProviderOptions Options { get; }
public AbpTemplateRenderer(
IServiceProvider serviceProvider,
ITemplateDefinitionManager templateDefinitionManager,
IOptions<AbpTemplateRendererProviderOptions> options)
{
ServiceProvider = serviceProvider;
TemplateDefinitionManager = templateDefinitionManager;
Options = options.Value;
}
public virtual async Task<string> RenderAsync(
string templateName,
object model = null,
string cultureName = null,
Dictionary<string, object> globalContext = null)
{
var templateDefinition = TemplateDefinitionManager.Get(templateName);
var renderEngine = templateDefinition.RenderEngine;
if (renderEngine.IsNullOrWhiteSpace())
{
renderEngine = ScribanTemplateRendererProvider.ProviderName;
}
var providerType = Options.GetProviderTypeOrNull(renderEngine);
if (providerType != null)
{
var templateRendererProvider = (ITemplateRendererProvider)ServiceProvider.GetRequiredService(providerType);
return await templateRendererProvider.RenderAsync(templateName, model, cultureName, globalContext);
}
throw new AbpException("There is no render engine found with template name: " + templateName);
}
}
}

5
framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs → framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TextTemplating/AbpTextTemplatingModule.cs

@ -1,10 +1,13 @@
using Volo.Abp.Modularity;
using Volo.Abp.TextTemplating.Razor;
using Volo.Abp.TextTemplating.Scriban;
namespace Volo.Abp.TextTemplating
{
[DependsOn(
typeof(AbpTextTemplatingScribanModule)
typeof(AbpTextTemplatingAbstractionsModule),
typeof(AbpTextTemplatingScribanModule),
typeof(AbpTextTemplatingRazorModule)
)]
public class AbpTextTemplatingModule : AbpModule
{

1
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj

@ -15,7 +15,6 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.TextTemplating.Razor\Volo.Abp.TextTemplating.Razor.csproj" />
<ProjectReference Include="..\Volo.Abp.TextTemplating.Tests\Volo.Abp.TextTemplating.Tests.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
</ItemGroup>

4
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorLocalizedTemplateContentReaderFactory_Tests.cs

@ -14,11 +14,11 @@ namespace Volo.Abp.TextTemplating.Razor
new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(),
"Volo", "Abp", "TextTemplating", "Razor"))));
WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel>" +
WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel>" +
Environment.NewLine +
"Welcome @Model.Name to the abp.io!";
WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel>" +
WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel>" +
Environment.NewLine +
"Merhaba @Model.Name, abp.io'ya hoşgeldiniz!";
}

4
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer_Tests.cs → framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider_Tests.cs

@ -4,11 +4,11 @@ using Xunit;
namespace Volo.Abp.TextTemplating.Razor
{
public class RazorTemplateRenderer_Tests : AbpTextTemplatingTestBase<RazorTextTemplatingTestModule>
public class RazorTemplateRendererProvider_Tests : AbpTextTemplatingTestBase<RazorTextTemplatingTestModule>
{
private readonly ITemplateRenderer _templateRenderer;
public RazorTemplateRenderer_Tests()
public RazorTemplateRendererProvider_Tests()
{
_templateRenderer = GetRequiredService<ITemplateRenderer>();
}

12
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTestTemplateDefinitionProvider.cs

@ -7,16 +7,20 @@ namespace Volo.Abp.TextTemplating.Razor
public override void Define(ITemplateDefinitionContext context)
{
context.GetOrNull(TestTemplates.WelcomeEmail)?
.WithVirtualFilePath("/SampleTemplates/WelcomeEmail", false);
.WithVirtualFilePath("/SampleTemplates/WelcomeEmail", false)
.WithRenderEngine(RazorTemplateRendererProvider.ProviderName);
context.GetOrNull(TestTemplates.ForgotPasswordEmail)?
.WithVirtualFilePath("/SampleTemplates/ForgotPasswordEmail.cshtml", true);
.WithVirtualFilePath("/SampleTemplates/ForgotPasswordEmail.cshtml", true)
.WithRenderEngine(RazorTemplateRendererProvider.ProviderName);
context.GetOrNull(TestTemplates.TestTemplateLayout1)?
.WithVirtualFilePath("/SampleTemplates/TestTemplateLayout1.cshtml", true);
.WithVirtualFilePath("/SampleTemplates/TestTemplateLayout1.cshtml", true)
.WithRenderEngine(RazorTemplateRendererProvider.ProviderName);
context.GetOrNull(TestTemplates.ShowDecimalNumber)?
.WithVirtualFilePath("/SampleTemplates/ShowDecimalNumber.cshtml", true);
.WithVirtualFilePath("/SampleTemplates/ShowDecimalNumber.cshtml", true)
.WithRenderEngine(RazorTemplateRendererProvider.ProviderName);
context.Add(new TemplateDefinition(RazorTestTemplates.TestTemplate).WithVirtualFilePath("/SampleTemplates/TestTemplate.cshtml", true));
}

1
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTextTemplatingTestModule.cs

@ -5,7 +5,6 @@ using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.TextTemplating.Razor
{
[DependsOn(
typeof(AbpTextTemplatingRazorModule),
typeof(AbpTextTemplatingTestModule)
)]
public class RazorTextTemplatingTestModule : AbpModule

6
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorVirtualFileTemplateContributor_Tests.cs

@ -7,15 +7,15 @@ namespace Volo.Abp.TextTemplating.Razor
{
public RazorVirtualFileTemplateContributor_Tests()
{
WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel>" +
WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel>" +
Environment.NewLine +
"Welcome @Model.Name to the abp.io!";
WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel>" +
WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel>" +
Environment.NewLine +
"Merhaba @Model.Name, abp.io'ya hoşgeldiniz!";
ForgotPasswordEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.ForgotPasswordEmailModel>" +
ForgotPasswordEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.ForgotPasswordEmailModel>" +
Environment.NewLine +
"@Localizer[\"HelloText\", Model.Name], @Localizer[\"HowAreYou\"]. Please click to the following link to get an email to reset your password!";
}

2
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml

@ -1,2 +1,2 @@
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.ForgotPasswordEmailModel>
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.ForgotPasswordEmailModel>
@Localizer["HelloText", Model.Name], @Localizer["HowAreYou"]. Please click to the following link to get an email to reset your password!

2
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml

@ -1,2 +1,2 @@
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.ShowDecimalNumberModel>
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.ShowDecimalNumberModel>
@Model.Amount

2
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/en.cshtml

@ -1,2 +1,2 @@
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel>
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel>
Welcome @Model.Name to the abp.io!

2
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/tr.cshtml

@ -1,2 +1,2 @@
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel>
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel>
Merhaba @Model.Name, abp.io'ya hoşgeldiniz!

3
framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj

@ -6,7 +6,7 @@
<TargetFramework>net5.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Volo\Abp\TextTemplating\Scriban\SampleTemplates\**\*.tpl">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
@ -15,7 +15,6 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.TextTemplating.Scriban\Volo.Abp.TextTemplating.Scriban.csproj" />
<ProjectReference Include="..\Volo.Abp.TextTemplating.Tests\Volo.Abp.TextTemplating.Tests.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
</ItemGroup>

4
framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer_Tests.cs → framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider_Tests.cs

@ -5,11 +5,11 @@ using Xunit;
namespace Volo.Abp.TextTemplating.Scriban
{
public class ScribanTemplateRenderer_Tests : AbpTextTemplatingTestBase<ScribanTextTemplatingTestModule>
public class ScribanTemplateRendererProvider_Tests : AbpTextTemplatingTestBase<ScribanTextTemplatingTestModule>
{
private readonly ITemplateRenderer _templateRenderer;
public ScribanTemplateRenderer_Tests()
public ScribanTemplateRendererProvider_Tests()
{
_templateRenderer = GetRequiredService<ITemplateRenderer>();
}

12
framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTestTemplateDefinitionProvider.cs

@ -5,16 +5,20 @@
public override void Define(ITemplateDefinitionContext context)
{
context.GetOrNull(TestTemplates.WelcomeEmail)?
.WithVirtualFilePath("/SampleTemplates/WelcomeEmail", false);
.WithVirtualFilePath("/SampleTemplates/WelcomeEmail", false)
.WithRenderEngine(ScribanTemplateRendererProvider.ProviderName);
context.GetOrNull(TestTemplates.ForgotPasswordEmail)?
.WithVirtualFilePath("/SampleTemplates/ForgotPasswordEmail.tpl", true);
.WithVirtualFilePath("/SampleTemplates/ForgotPasswordEmail.tpl", true)
.WithRenderEngine(ScribanTemplateRendererProvider.ProviderName);
context.GetOrNull(TestTemplates.TestTemplateLayout1)?
.WithVirtualFilePath("/SampleTemplates/TestTemplateLayout1.tpl", true);
.WithVirtualFilePath("/SampleTemplates/TestTemplateLayout1.tpl", true)
.WithRenderEngine(ScribanTemplateRendererProvider.ProviderName);
context.GetOrNull(TestTemplates.ShowDecimalNumber)?
.WithVirtualFilePath("/SampleTemplates/ShowDecimalNumber.tpl", true);
.WithVirtualFilePath("/SampleTemplates/ShowDecimalNumber.tpl", true)
.WithRenderEngine(ScribanTemplateRendererProvider.ProviderName);
}
}
}

1
framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTextTemplatingTestModule.cs

@ -4,7 +4,6 @@ using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.TextTemplating.Scriban
{
[DependsOn(
typeof(AbpTextTemplatingScribanModule),
typeof(AbpTextTemplatingTestModule)
)]
public class ScribanTextTemplatingTestModule : AbpModule

10
framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj

@ -10,12 +10,20 @@
<ItemGroup>
<EmbeddedResource Include="Volo\Abp\TextTemplating\Localization\**\*.json" />
<None Remove="Volo\Abp\TextTemplating\Localization\**\*.json" />
<EmbeddedResource Include="Volo\Abp\TextTemplating\SampleTemplates\**\*.cshtml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
<None Remove="Volo\Abp\TextTemplating\SampleTemplates\**\*.cshtml" />
<EmbeddedResource Include="Volo\Abp\TextTemplating\SampleTemplates\**\*.tpl">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
<None Remove="Volo\Abp\TextTemplating\SampleTemplates\**\*.tpl" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Localization\Volo.Abp.Localization.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.TextTemplating.Abstractions\Volo.Abp.TextTemplating.Abstractions.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.TextTemplating\Volo.Abp.TextTemplating.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
</ItemGroup>

16
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs

@ -1,13 +1,16 @@
using Volo.Abp.Autofac;
using System.Collections.Generic;
using Microsoft.CodeAnalysis;
using Volo.Abp.Autofac;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.TextTemplating.Localization;
using Volo.Abp.TextTemplating.Razor;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.TextTemplating
{
[DependsOn(
typeof(AbpTextTemplatingAbstractionsModule),
typeof(AbpTextTemplatingModule),
typeof(AbpTestBaseModule),
typeof(AbpAutofacModule),
typeof(AbpLocalizationModule)
@ -27,6 +30,15 @@ namespace Volo.Abp.TextTemplating
.Add<TestLocalizationSource>("en")
.AddVirtualJson("/Localization");
});
Configure<AbpCompiledViewProviderOptions>(options =>
{
options.TemplateReferences.Add(TestTemplates.HybridTemplateRazor,
new List<PortableExecutableReference>()
{
MetadataReference.CreateFromFile(typeof(AbpTextTemplatingTestModule).Assembly.Location)
});
});
}
}
}

46
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/HybridTemplateRendererProvider_Tests.cs

@ -0,0 +1,46 @@
using System.Threading.Tasks;
using Shouldly;
using Xunit;
namespace Volo.Abp.TextTemplating
{
public class HybridTemplateRendererProvider_Tests : AbpTextTemplatingTestBase<AbpTextTemplatingTestModule>
{
private readonly ITemplateRenderer _templateRenderer;
public HybridTemplateRendererProvider_Tests()
{
_templateRenderer = GetRequiredService<ITemplateRenderer>();
}
[Fact]
public async Task Should_Render_By_Scriban()
{
(await _templateRenderer.RenderAsync(
TestTemplates.HybridTemplateScriban,
model: new
{
name = "John"
}
)).ShouldBe("Hello John, how are you?");
}
[Fact]
public async Task Should_Render_By_Razor()
{
(await _templateRenderer.RenderAsync(
TestTemplates.HybridTemplateRazor,
model: new HybridModel
{
Name = "John"
}
)).ShouldBe("Hello John, how are you?");
}
public class HybridModel
{
public string Name { get; set; }
}
}
}

2
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestRazorTemplate.cshtml

@ -0,0 +1,2 @@
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.HybridTemplateRendererProvider_Tests.HybridModel>
Hello @Model.Name, @Localizer["HowAreYou"]

1
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestScribanTemplate.tpl

@ -0,0 +1 @@
Hello {{model.name}}, {{L "HowAreYou" }}

22
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs

@ -1,4 +1,6 @@
using Volo.Abp.TextTemplating.Localization;
using Volo.Abp.TextTemplating.Razor;
using Volo.Abp.TextTemplating.Scriban;
namespace Volo.Abp.TextTemplating
{
@ -35,6 +37,26 @@ namespace Volo.Abp.TextTemplating
layout: TestTemplates.TestTemplateLayout1
)
);
context.Add(
new TemplateDefinition(
TestTemplates.HybridTemplateScriban,
localizationResource: typeof(TestLocalizationSource),
layout: null
)
.WithVirtualFilePath("/SampleTemplates/TestScribanTemplate.tpl", true)
.WithRenderEngine(ScribanTemplateRendererProvider.ProviderName)
);
context.Add(
new TemplateDefinition(
TestTemplates.HybridTemplateRazor,
localizationResource: typeof(TestLocalizationSource),
layout: null
)
.WithVirtualFilePath("/SampleTemplates/TestRazorTemplate.cshtml", true)
.WithRenderEngine(RazorTemplateRendererProvider.ProviderName)
);
}
}
}

5
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplates.cs

@ -6,5 +6,8 @@
public const string ForgotPasswordEmail = "ForgotPasswordEmail";
public const string TestTemplateLayout1 = "TestTemplateLayout1";
public const string ShowDecimalNumber = "ShowDecimalNumber";
public const string HybridTemplateRazor = "HybridTemplateRazor";
public const string HybridTemplateScriban = "HybridTemplateScriban";
}
}
}

Loading…
Cancel
Save