From d699938d8d5ed67fbecb4198e50d8b8682b2e391 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Thu, 21 Dec 2023 21:39:36 +0300 Subject: [PATCH 1/3] Add object mapping APIs --- src/OrchardCore.Build/Dependencies.props | 1 + .../ServiceExtensions.cs | 1 + .../Mappings/IMapper.cs | 24 +++++++++++++++++++ .../OrchardCoreBuilderExtensions.cs | 23 ++++++++++++++++++ .../Mappings/Mapper.cs | 15 ++++++++++++ .../OrchardCore.Infrastructure.csproj | 1 + 6 files changed, 65 insertions(+) create mode 100644 src/OrchardCore/OrchardCore.Infrastructure.Abstractions/Mappings/IMapper.cs create mode 100644 src/OrchardCore/OrchardCore.Infrastructure/Mappings/Extensions/OrchardCoreBuilderExtensions.cs create mode 100644 src/OrchardCore/OrchardCore.Infrastructure/Mappings/Mapper.cs diff --git a/src/OrchardCore.Build/Dependencies.props b/src/OrchardCore.Build/Dependencies.props index a249dcc0f49..74842e738f5 100644 --- a/src/OrchardCore.Build/Dependencies.props +++ b/src/OrchardCore.Build/Dependencies.props @@ -34,6 +34,7 @@ + diff --git a/src/OrchardCore/OrchardCore.Application.Cms.Core.Targets/ServiceExtensions.cs b/src/OrchardCore/OrchardCore.Application.Cms.Core.Targets/ServiceExtensions.cs index 818a1132aa2..e1072d2a869 100644 --- a/src/OrchardCore/OrchardCore.Application.Cms.Core.Targets/ServiceExtensions.cs +++ b/src/OrchardCore/OrchardCore.Application.Cms.Core.Targets/ServiceExtensions.cs @@ -22,6 +22,7 @@ public static OrchardCoreBuilder AddOrchardCms(this IServiceCollection services) .AddSecurity() .AddMvc() .AddIdGeneration() + .AddMappings() .AddEmailAddressValidator() .AddHtmlSanitizer() .AddSetupFeatures("OrchardCore.Setup") diff --git a/src/OrchardCore/OrchardCore.Infrastructure.Abstractions/Mappings/IMapper.cs b/src/OrchardCore/OrchardCore.Infrastructure.Abstractions/Mappings/IMapper.cs new file mode 100644 index 00000000000..1e0100f3a05 --- /dev/null +++ b/src/OrchardCore/OrchardCore.Infrastructure.Abstractions/Mappings/IMapper.cs @@ -0,0 +1,24 @@ +namespace OrchardCore.Mappings; + +/// +/// Represents a contract for mapping objects. +/// +public interface IMapper +{ + /// + /// Maps the specified source object to a new object of the specified destination type. + /// + /// The type of object to map to. + /// The object to be mapped. + TDestination Map(object source); + + /// + /// Maps the specified source object to the specified destination object. + /// + /// + /// + /// The object to be mapped. + /// The object to map to. + /// + TDestination Map(TSource source, TDestination destination); +} diff --git a/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Extensions/OrchardCoreBuilderExtensions.cs b/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Extensions/OrchardCoreBuilderExtensions.cs new file mode 100644 index 00000000000..5f28ad20abd --- /dev/null +++ b/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Extensions/OrchardCoreBuilderExtensions.cs @@ -0,0 +1,23 @@ +using OrchardCore.Mappings; + +namespace Microsoft.Extensions.DependencyInjection; + +/// +/// Provides an extension method for . +/// +public static partial class OrchardCoreBuilderExtensions +{ + /// + /// Adds e-mail address validator service. + /// + /// The . + public static OrchardCoreBuilder AddMappings(this OrchardCoreBuilder builder) + { + builder.ConfigureServices(services => + { + services.AddTransient(); + }); + + return builder; + } +} diff --git a/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Mapper.cs b/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Mapper.cs new file mode 100644 index 00000000000..c1c405f580b --- /dev/null +++ b/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Mapper.cs @@ -0,0 +1,15 @@ +using Mapster; + +namespace OrchardCore.Mappings; + +/// +/// Represents a service for mapping objects. +/// +public class Mapper : IMapper +{ + /// + public TDestination Map(object source) => TypeAdapter.Adapt(source); + + /// + public TDestination Map(TSource source, TDestination destination) => TypeAdapter.Map(source); +} diff --git a/src/OrchardCore/OrchardCore.Infrastructure/OrchardCore.Infrastructure.csproj b/src/OrchardCore/OrchardCore.Infrastructure/OrchardCore.Infrastructure.csproj index d0701e3871d..00b534677b3 100644 --- a/src/OrchardCore/OrchardCore.Infrastructure/OrchardCore.Infrastructure.csproj +++ b/src/OrchardCore/OrchardCore.Infrastructure/OrchardCore.Infrastructure.csproj @@ -15,6 +15,7 @@ + From 550c88409ec7a8eee93bc5325e22776695dfe94c Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Thu, 21 Dec 2023 21:39:57 +0300 Subject: [PATCH 2/3] Use object mapping in SmtpSettingsConfigurations --- .../Services/SmtpSettingsConfiguration.cs | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Email/Services/SmtpSettingsConfiguration.cs b/src/OrchardCore.Modules/OrchardCore.Email/Services/SmtpSettingsConfiguration.cs index 4d2c9b3ce8d..940886a95b2 100644 --- a/src/OrchardCore.Modules/OrchardCore.Email/Services/SmtpSettingsConfiguration.cs +++ b/src/OrchardCore.Modules/OrchardCore.Email/Services/SmtpSettingsConfiguration.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.DataProtection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using OrchardCore.Mappings; using OrchardCore.Settings; namespace OrchardCore.Email.Services @@ -10,15 +11,18 @@ public class SmtpSettingsConfiguration : IConfigureOptions private readonly ISiteService _site; private readonly IDataProtectionProvider _dataProtectionProvider; private readonly ILogger _logger; + private readonly IMapper _mapper; public SmtpSettingsConfiguration( ISiteService site, IDataProtectionProvider dataProtectionProvider, - ILogger logger) + ILogger logger, + IMapper mapper) { _site = site; _dataProtectionProvider = dataProtectionProvider; _logger = logger; + _mapper = mapper; } public void Configure(SmtpSettings options) @@ -27,20 +31,7 @@ public void Configure(SmtpSettings options) .GetAwaiter().GetResult() .As(); - options.DefaultSender = settings.DefaultSender; - options.DeliveryMethod = settings.DeliveryMethod; - options.PickupDirectoryLocation = settings.PickupDirectoryLocation; - options.Host = settings.Host; - options.Port = settings.Port; - options.ProxyHost = settings.ProxyHost; - options.ProxyPort = settings.ProxyPort; - options.EncryptionMethod = settings.EncryptionMethod; - options.AutoSelectEncryption = settings.AutoSelectEncryption; - options.RequireCredentials = settings.RequireCredentials; - options.UseDefaultCredentials = settings.UseDefaultCredentials; - options.UserName = settings.UserName; - options.Password = settings.Password; - options.IgnoreInvalidSslCertificate = settings.IgnoreInvalidSslCertificate; + options = _mapper.Map(settings); // Decrypt the password if (!string.IsNullOrWhiteSpace(settings.Password)) From 05375a77d3581eaf887c7ed936cedd19c02613a1 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Sat, 23 Mar 2024 22:18:23 +0300 Subject: [PATCH 3/3] Use Mapperly --- src/OrchardCore.Build/Dependencies.props | 3 +-- .../OrchardCore.Email.Smtp.csproj | 2 ++ .../Services/SmtpOptionsConfiguration.cs | 16 ++----------- .../Services/SmtpSettingsMapper.cs | 9 ++++++++ .../ServiceExtensions.cs | 1 - .../OrchardCoreBuilderExtensions.cs | 23 ------------------- .../Mappings/Mapper.cs | 15 ------------ .../Mappings/ObjectMapper.cs | 12 ++++++++++ .../OrchardCore.Infrastructure.csproj | 2 +- 9 files changed, 27 insertions(+), 56 deletions(-) create mode 100644 src/OrchardCore.Modules/OrchardCore.Email.Smtp/Services/SmtpSettingsMapper.cs delete mode 100644 src/OrchardCore/OrchardCore.Infrastructure/Mappings/Extensions/OrchardCoreBuilderExtensions.cs delete mode 100644 src/OrchardCore/OrchardCore.Infrastructure/Mappings/Mapper.cs create mode 100644 src/OrchardCore/OrchardCore.Infrastructure/Mappings/ObjectMapper.cs diff --git a/src/OrchardCore.Build/Dependencies.props b/src/OrchardCore.Build/Dependencies.props index 9cc24a7a454..474f9996536 100644 --- a/src/OrchardCore.Build/Dependencies.props +++ b/src/OrchardCore.Build/Dependencies.props @@ -38,8 +38,6 @@ - - @@ -62,6 +60,7 @@ + diff --git a/src/OrchardCore.Modules/OrchardCore.Email.Smtp/OrchardCore.Email.Smtp.csproj b/src/OrchardCore.Modules/OrchardCore.Email.Smtp/OrchardCore.Email.Smtp.csproj index c80c6b4672c..8d0f96dc977 100644 --- a/src/OrchardCore.Modules/OrchardCore.Email.Smtp/OrchardCore.Email.Smtp.csproj +++ b/src/OrchardCore.Modules/OrchardCore.Email.Smtp/OrchardCore.Email.Smtp.csproj @@ -22,6 +22,7 @@ + @@ -29,6 +30,7 @@ + diff --git a/src/OrchardCore.Modules/OrchardCore.Email.Smtp/Services/SmtpOptionsConfiguration.cs b/src/OrchardCore.Modules/OrchardCore.Email.Smtp/Services/SmtpOptionsConfiguration.cs index 0ac92e3870f..6d5b2d24384 100644 --- a/src/OrchardCore.Modules/OrchardCore.Email.Smtp/Services/SmtpOptionsConfiguration.cs +++ b/src/OrchardCore.Modules/OrchardCore.Email.Smtp/Services/SmtpOptionsConfiguration.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.DataProtection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using OrchardCore.Mappings; using OrchardCore.Settings; namespace OrchardCore.Email.Smtp.Services; @@ -29,20 +30,7 @@ public void Configure(SmtpOptions options) .GetAwaiter().GetResult() .As(); - options.DefaultSender = settings.DefaultSender; - options.DeliveryMethod = settings.DeliveryMethod; - options.PickupDirectoryLocation = settings.PickupDirectoryLocation; - options.Host = settings.Host; - options.Port = settings.Port; - options.ProxyHost = settings.ProxyHost; - options.ProxyPort = settings.ProxyPort; - options.EncryptionMethod = settings.EncryptionMethod; - options.AutoSelectEncryption = settings.AutoSelectEncryption; - options.RequireCredentials = settings.RequireCredentials; - options.UseDefaultCredentials = settings.UseDefaultCredentials; - options.UserName = settings.UserName; - options.Password = settings.Password; - options.IgnoreInvalidSslCertificate = settings.IgnoreInvalidSslCertificate; + options = SmtpSettingsMapper.Map(settings); if (!string.IsNullOrWhiteSpace(settings.Password)) { diff --git a/src/OrchardCore.Modules/OrchardCore.Email.Smtp/Services/SmtpSettingsMapper.cs b/src/OrchardCore.Modules/OrchardCore.Email.Smtp/Services/SmtpSettingsMapper.cs new file mode 100644 index 00000000000..fba02b98457 --- /dev/null +++ b/src/OrchardCore.Modules/OrchardCore.Email.Smtp/Services/SmtpSettingsMapper.cs @@ -0,0 +1,9 @@ +using Riok.Mapperly.Abstractions; + +namespace OrchardCore.Email.Smtp.Services; + +[Mapper] +public static partial class SmtpSettingsMapper +{ + public static partial SmtpOptions Map(SmtpSettings source); +} diff --git a/src/OrchardCore/OrchardCore.Application.Cms.Core.Targets/ServiceExtensions.cs b/src/OrchardCore/OrchardCore.Application.Cms.Core.Targets/ServiceExtensions.cs index 8967feb7ad1..3d570d6d85f 100644 --- a/src/OrchardCore/OrchardCore.Application.Cms.Core.Targets/ServiceExtensions.cs +++ b/src/OrchardCore/OrchardCore.Application.Cms.Core.Targets/ServiceExtensions.cs @@ -19,7 +19,6 @@ public static OrchardCoreBuilder AddOrchardCms(this IServiceCollection services) .AddSecurity() .AddMvc() .AddIdGeneration() - .AddMappings() .AddEmailAddressValidator() .AddHtmlSanitizer() .AddSetupFeatures("OrchardCore.Setup") diff --git a/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Extensions/OrchardCoreBuilderExtensions.cs b/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Extensions/OrchardCoreBuilderExtensions.cs deleted file mode 100644 index 5f28ad20abd..00000000000 --- a/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Extensions/OrchardCoreBuilderExtensions.cs +++ /dev/null @@ -1,23 +0,0 @@ -using OrchardCore.Mappings; - -namespace Microsoft.Extensions.DependencyInjection; - -/// -/// Provides an extension method for . -/// -public static partial class OrchardCoreBuilderExtensions -{ - /// - /// Adds e-mail address validator service. - /// - /// The . - public static OrchardCoreBuilder AddMappings(this OrchardCoreBuilder builder) - { - builder.ConfigureServices(services => - { - services.AddTransient(); - }); - - return builder; - } -} diff --git a/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Mapper.cs b/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Mapper.cs deleted file mode 100644 index c1c405f580b..00000000000 --- a/src/OrchardCore/OrchardCore.Infrastructure/Mappings/Mapper.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mapster; - -namespace OrchardCore.Mappings; - -/// -/// Represents a service for mapping objects. -/// -public class Mapper : IMapper -{ - /// - public TDestination Map(object source) => TypeAdapter.Adapt(source); - - /// - public TDestination Map(TSource source, TDestination destination) => TypeAdapter.Map(source); -} diff --git a/src/OrchardCore/OrchardCore.Infrastructure/Mappings/ObjectMapper.cs b/src/OrchardCore/OrchardCore.Infrastructure/Mappings/ObjectMapper.cs new file mode 100644 index 00000000000..fcc7c5ee005 --- /dev/null +++ b/src/OrchardCore/OrchardCore.Infrastructure/Mappings/ObjectMapper.cs @@ -0,0 +1,12 @@ +using Riok.Mapperly.Abstractions; + +namespace OrchardCore.Mappings; + +/// +/// Represents a service for mapping objects. +/// +[Mapper] +public static partial class ObjectMapper +{ + public static partial TTarget Map(TSource source); +} diff --git a/src/OrchardCore/OrchardCore.Infrastructure/OrchardCore.Infrastructure.csproj b/src/OrchardCore/OrchardCore.Infrastructure/OrchardCore.Infrastructure.csproj index 00b534677b3..9448012b1d1 100644 --- a/src/OrchardCore/OrchardCore.Infrastructure/OrchardCore.Infrastructure.csproj +++ b/src/OrchardCore/OrchardCore.Infrastructure/OrchardCore.Infrastructure.csproj @@ -15,8 +15,8 @@ - +