diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTemplateRendererProviderOptions.cs b/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTemplateRendererProviderOptions.cs new file mode 100644 index 0000000000..1b7754585f --- /dev/null +++ b/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 Providers { get; } + + public AbpTemplateRendererProviderOptions() + { + Providers = new Dictionary(); + } + + public AbpTemplateRendererProviderOptions AddProvider(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); + } + } +} diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateRendererProvider.cs b/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateRendererProvider.cs new file mode 100644 index 0000000000..f2167f2781 --- /dev/null +++ b/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; } + + /// + /// Renders a text template. + /// + /// The template name + /// An optional model object that is used in the template + /// Culture name. Uses the if not specified + /// A dictionary which can be used to import global objects to the template + /// + Task RenderAsync( + [NotNull] string templateName, + [CanBeNull] object model = null, + [CanBeNull] string cultureName = null, + [CanBeNull] Dictionary globalContext = null + ); + } +} diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinition.cs b/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinition.cs index 948c1712db..cda06eccd7 100644 --- a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinition.cs +++ b/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; } + /// /// Gets/sets a key-value on the . /// @@ -84,5 +87,14 @@ namespace Volo.Abp.TextTemplating Properties[key] = value; return this; } + + /// + /// Sets the Render Engine of . + /// + public virtual TemplateDefinition WithRenderEngine(string renderEngine) + { + RenderEngine = renderEngine; + return this; + } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateRendererProviderBase.cs b/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateRendererProviderBase.cs new file mode 100644 index 0000000000..5a44ee752e --- /dev/null +++ b/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 RenderAsync(string templateName, object model = null, string cultureName = null, Dictionary globalContext = null); + + protected virtual async Task 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(); + } + } +} diff --git a/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/AbpTextTemplatingRazorModule.cs b/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/AbpTextTemplatingRazorModule.cs index 318a356b93..c53f43ac6f 100644 --- a/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/AbpTextTemplatingRazorModule.cs +++ b/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(options => + { + options.AddProvider(RazorTemplateRendererProvider.ProviderName); + }); + } } } diff --git a/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer.cs b/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider.cs similarity index 77% rename from framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer.cs rename to framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider.cs index db06e67d4a..0559ace16e 100644 --- a/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer.cs +++ b/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 RenderAsync( + public override async Task RenderAsync( [NotNull] string templateName, [CanBeNull] object model = null, [CanBeNull] string cultureName = null, @@ -74,7 +74,7 @@ namespace Volo.Abp.TextTemplating.Razor Dictionary 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 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(); - } } } diff --git a/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/AbpTextTemplatingScribanModule.cs b/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/AbpTextTemplatingScribanModule.cs index 789b9e376f..2659f6b574 100644 --- a/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/AbpTextTemplatingScribanModule.cs +++ b/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(options => + { + options.AddProvider(ScribanTemplateRendererProvider.ProviderName); + }); + } } } diff --git a/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer.cs b/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider.cs similarity index 77% rename from framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer.cs rename to framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider.cs index 3fdd667a82..cecec2ab56 100644 --- a/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer.cs +++ b/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 RenderAsync( + public override async Task RenderAsync( [NotNull] string templateName, [CanBeNull] object model = null, [CanBeNull] string cultureName = null, @@ -64,7 +61,7 @@ namespace Volo.Abp.TextTemplating.Scriban Dictionary 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 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(); - } } } diff --git a/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj b/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj index 3af0ba984d..c48648b491 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj +++ b/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj @@ -10,6 +10,7 @@ + diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TextTemplating/AbpTemplateRenderer.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TextTemplating/AbpTemplateRenderer.cs new file mode 100644 index 0000000000..e59fd25d9e --- /dev/null +++ b/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 options) + { + ServiceProvider = serviceProvider; + TemplateDefinitionManager = templateDefinitionManager; + Options = options.Value; + } + + public virtual async Task RenderAsync( + string templateName, + object model = null, + string cultureName = null, + Dictionary 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); + } + } +} diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TextTemplating/AbpTextTemplatingModule.cs similarity index 51% rename from framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs rename to framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TextTemplating/AbpTextTemplatingModule.cs index d5817d0d33..01296925a1 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs +++ b/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 { diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj index ca26b60a4b..7161e0520a 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj @@ -15,7 +15,6 @@ - diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorLocalizedTemplateContentReaderFactory_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorLocalizedTemplateContentReaderFactory_Tests.cs index 53eaf0fc80..28ecb6db52 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorLocalizedTemplateContentReaderFactory_Tests.cs +++ b/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" + + WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + Environment.NewLine + "Welcome @Model.Name to the abp.io!"; - WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + + WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + Environment.NewLine + "Merhaba @Model.Name, abp.io'ya hoşgeldiniz!"; } diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider_Tests.cs similarity index 96% rename from framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer_Tests.cs rename to framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider_Tests.cs index 07da572c1e..04e2d1b029 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer_Tests.cs +++ b/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 + public class RazorTemplateRendererProvider_Tests : AbpTextTemplatingTestBase { private readonly ITemplateRenderer _templateRenderer; - public RazorTemplateRenderer_Tests() + public RazorTemplateRendererProvider_Tests() { _templateRenderer = GetRequiredService(); } diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTestTemplateDefinitionProvider.cs b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTestTemplateDefinitionProvider.cs index 3bb1d7f831..0719a96a24 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTestTemplateDefinitionProvider.cs +++ b/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)); } diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTextTemplatingTestModule.cs b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTextTemplatingTestModule.cs index df2f8b3b3d..74d7add887 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTextTemplatingTestModule.cs +++ b/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 diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorVirtualFileTemplateContributor_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorVirtualFileTemplateContributor_Tests.cs index 5634ccfa2c..5bbb267613 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorVirtualFileTemplateContributor_Tests.cs +++ b/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" + + WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + Environment.NewLine + "Welcome @Model.Name to the abp.io!"; - WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + + WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + Environment.NewLine + "Merhaba @Model.Name, abp.io'ya hoşgeldiniz!"; - ForgotPasswordEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + + ForgotPasswordEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + Environment.NewLine + "@Localizer[\"HelloText\", Model.Name], @Localizer[\"HowAreYou\"]. Please click to the following link to get an email to reset your password!"; } diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml index e02bc728ab..360e5b2a7c 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml @@ -1,2 +1,2 @@ -@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase +@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase @Localizer["HelloText", Model.Name], @Localizer["HowAreYou"]. Please click to the following link to get an email to reset your password! \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml index d309dc5a2b..64a133f903 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml @@ -1,2 +1,2 @@ -@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase +@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase @Model.Amount \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/en.cshtml b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/en.cshtml index 410bfe1240..af025d39c3 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/en.cshtml +++ b/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 +@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase Welcome @Model.Name to the abp.io! \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/tr.cshtml b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/tr.cshtml index 7ea3c8802a..c17e07bee1 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/tr.cshtml +++ b/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 +@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase Merhaba @Model.Name, abp.io'ya hoşgeldiniz! \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj index d17a4d46fa..1cdcf89ab9 100644 --- a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj +++ b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj @@ -6,7 +6,7 @@ net5.0 - + Always @@ -15,7 +15,6 @@ - diff --git a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider_Tests.cs similarity index 96% rename from framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer_Tests.cs rename to framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider_Tests.cs index a076301919..cc0e45828b 100644 --- a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer_Tests.cs +++ b/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 + public class ScribanTemplateRendererProvider_Tests : AbpTextTemplatingTestBase { private readonly ITemplateRenderer _templateRenderer; - public ScribanTemplateRenderer_Tests() + public ScribanTemplateRendererProvider_Tests() { _templateRenderer = GetRequiredService(); } diff --git a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTestTemplateDefinitionProvider.cs b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTestTemplateDefinitionProvider.cs index 956c376fd0..d929a00e00 100644 --- a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTestTemplateDefinitionProvider.cs +++ b/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); } } } diff --git a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTextTemplatingTestModule.cs b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTextTemplatingTestModule.cs index 2ed2e51b56..ff9da00c36 100644 --- a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTextTemplatingTestModule.cs +++ b/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 diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj b/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj index 65983605be..814b5a6922 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj @@ -10,12 +10,20 @@ + + Always + + + + Always + + - + diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs index 74174ea690..3a32ad353b 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs +++ b/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("en") .AddVirtualJson("/Localization"); }); + + Configure(options => + { + options.TemplateReferences.Add(TestTemplates.HybridTemplateRazor, + new List() + { + MetadataReference.CreateFromFile(typeof(AbpTextTemplatingTestModule).Assembly.Location) + }); + }); } } } diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/HybridTemplateRendererProvider_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/HybridTemplateRendererProvider_Tests.cs new file mode 100644 index 0000000000..f6fffc89a7 --- /dev/null +++ b/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 + { + private readonly ITemplateRenderer _templateRenderer; + + public HybridTemplateRendererProvider_Tests() + { + _templateRenderer = GetRequiredService(); + } + + [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; } + } + + } +} diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestRazorTemplate.cshtml b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestRazorTemplate.cshtml new file mode 100644 index 0000000000..02cf7a82a8 --- /dev/null +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestRazorTemplate.cshtml @@ -0,0 +1,2 @@ +@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase +Hello @Model.Name, @Localizer["HowAreYou"] \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestScribanTemplate.tpl b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestScribanTemplate.tpl new file mode 100644 index 0000000000..d1b39f873c --- /dev/null +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestScribanTemplate.tpl @@ -0,0 +1 @@ +Hello {{model.name}}, {{L "HowAreYou" }} \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs index 289bf1b04f..5c111b5fd5 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs +++ b/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) + ); } } } diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplates.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplates.cs index 29a8604f3b..25d8223b78 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplates.cs +++ b/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"; } -} \ No newline at end of file +}