Add multi-targeting support for .NET frameworks

Introduced conditional compilation using `#if NET` directives to
enable support for multiple frameworks (`net462`, `net480`, and
`net8.0`). Updated the project file to support multi-targeting
and added framework-specific dependencies conditionally.

Refactored namespaces, interfaces, classes, validators, and
handlers to ensure compatibility with targeted frameworks.
Enhanced dependency injection setup and adjusted logic in
`GetSenderQueryHandler` for framework-specific behavior.

Ensured consistency and maintainability by wrapping framework-
specific code blocks with `#if NET` directives.
This commit is contained in:
2026-08-12 14:40:47 +02:00
parent 5e0de6d52a
commit 4dd0974c6f
18 changed files with 54 additions and 20 deletions

View File

@@ -1,3 +1,4 @@
#if NET
using DigitalData.MessagingService.Abstraction;
using DigitalData.MessagingService.Application.Common.Models.MailSearch;
@@ -31,3 +32,4 @@ public interface IImapEmailService
string folder = "INBOX",
CancellationToken cancellationToken = default);
}
#endif

View File

@@ -1,3 +1,4 @@
#if NET
using AutoMapper;
using DigitalData.MessagingService.Application.EmailSending.Commands;
using DigitalData.MessagingService.Abstraction;
@@ -18,3 +19,4 @@ public class EmailMappingProfile : Profile
.ForMember(dest => dest.Attachments, opt => opt.MapFrom(src => src.Attachments));
}
}
#endif

View File

@@ -1,3 +1,4 @@
#if NET
namespace DigitalData.MessagingService.Application.Common.Models.MailSearch;
/// <summary>
@@ -11,3 +12,4 @@ namespace DigitalData.MessagingService.Application.Common.Models.MailSearch;
/// <param name="After">Earliest date to include (inclusive). Maps to IMAP <c>SINCE</c>.</param>
/// <param name="Before">Latest date to include (inclusive). Maps to IMAP <c>BEFORE</c> (next day is used internally).</param>
public record DateFilter(DateTime? After = null, DateTime? Before = null);
#endif

View File

@@ -1,4 +1,5 @@
namespace DigitalData.MessagingService.Application.Common.Models.MailSearch;
#if NET
namespace DigitalData.MessagingService.Application.Common.Models.MailSearch;
/// <summary>
/// Describes all criteria and options used when searching an IMAP mailbox.
@@ -75,4 +76,5 @@ public record MailSearchFilter
/// See <see cref="DateFilter"/> for rules between its fields.
/// </summary>
public DateFilter? Date { get; init; } = null;
}
}
#endif

View File

@@ -1,4 +1,5 @@
namespace DigitalData.MessagingService.Application.Common.Models.MailSearch;
#if NET
namespace DigitalData.MessagingService.Application.Common.Models.MailSearch;
/// <summary>
/// Constrains the search to a specific UID or a UID range.
@@ -11,4 +12,5 @@
/// <param name="Min">Lower bound of the UID range (inclusive). Ignored when <see cref="Absolute"/> is set.</param>
/// <param name="Max">Upper bound of the UID range (inclusive). Ignored when <see cref="Absolute"/> is set.</param>
/// <param name="Absolute">Exact UID to match. When set, <see cref="Min"/> and <see cref="Max"/> must be <see langword="null"/>.</param>
public record UidFilter(long? Min = null, long? Max = null, long? Absolute = null);
public record UidFilter(long? Min = null, long? Max = null, long? Absolute = null);
#endif

View File

@@ -1,4 +1,5 @@
using DigitalData.MessagingService.Abstraction;
#if NET
using DigitalData.MessagingService.Abstraction;
namespace DigitalData.MessagingService.Application.Common.Options;
@@ -21,3 +22,4 @@ public class EmailAccountsOptions
/// </summary>
public int SyncIntervalSeconds { get; init; } = 300;
}
#endif

View File

@@ -1,8 +1,8 @@
#if NET
using DigitalData.MessagingService.Application.Common.Options;
using FluentValidation;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Reflection;
namespace DigitalData.MessagingService.Application;
@@ -43,3 +43,4 @@ public static class DependencyInjection
return services;
}
}
#endif

View File

@@ -1,9 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<TargetFrameworks>net462;net480;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
@@ -11,7 +12,7 @@
<ProjectReference Include="..\DigitalData.MessagingService.Abstraction\DigitalData.MessagingService.Abstraction.csproj" />
</ItemGroup>
<ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
<PackageReference Include="AutoMapper" Version="16.2.0" />
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="12.1.1" />
<PackageReference Include="MediatR" Version="14.2.0" />

View File

@@ -1,4 +1,5 @@
using DigitalData.MessagingService.Application.Common.Options;
#if NET
using DigitalData.MessagingService.Application.Common.Options;
using DigitalData.MessagingService.Abstraction;
using MediatR;
using Microsoft.Extensions.Logging;
@@ -22,7 +23,7 @@ public class GetSenderQueryHandler(IOptions<EmailAccountsOptions> Options, ILogg
{
public Task<EmailAccountDto?> Handle(GetSenderQuery request, CancellationToken cancellationToken)
{
var accounts = request.Id is not null
var accounts = request.Id is not null
? Options.Value.Accounts.Where(a => a.Id == request.Id)
: Options.Value.Accounts.Where(a => a.Username == request.Username);
@@ -36,4 +37,5 @@ public class GetSenderQueryHandler(IOptions<EmailAccountsOptions> Options, ILogg
return Task.FromResult(accounts.FirstOrDefault());
}
}
}
#endif

View File

@@ -1,3 +1,4 @@
#if NET
using DigitalData.MessagingService.Application.EmailAccount.Queries;
using FluentValidation;
@@ -25,3 +26,4 @@ public class GetSenderQueryValidator : AbstractValidator<GetSenderQuery>
});
}
}
#endif

View File

@@ -1,3 +1,4 @@
#if NET
using DigitalData.MessagingService.Application.Common.Interfaces;
using DigitalData.MessagingService.Application.EmailAccount.Queries;
using DigitalData.MessagingService.Domain.Exceptions;
@@ -40,3 +41,4 @@ public class MarkEmailAsSeenCommandHandler(
await ImapService.MarkAsSeenAsync(account, request.Uid, request.Folder, cancellationToken);
}
}
#endif

View File

@@ -1,3 +1,4 @@
#if NET
using DigitalData.MessagingService.Abstraction;
using DigitalData.MessagingService.Application.Common.Interfaces;
using DigitalData.MessagingService.Application.Common.Models.MailSearch;
@@ -43,3 +44,4 @@ public class FetchEmailsQueryHandler(
cancellationToken);
}
}
#endif

View File

@@ -1,4 +1,5 @@
using DigitalData.MessagingService.Application.Common.Models.MailSearch;
#if NET
using DigitalData.MessagingService.Application.Common.Models.MailSearch;
using FluentValidation;
namespace DigitalData.MessagingService.Application.EmailReceiving.Validators;
@@ -34,4 +35,5 @@ public class DateFilterValidator : AbstractValidator<DateFilter>
.WithMessage("Date.After must be earlier than Date.Before.")
.When(x => x.After is not null && x.Before is not null);
}
}
}
#endif

View File

@@ -1,3 +1,4 @@
#if NET
using DigitalData.MessagingService.Application.EmailReceiving.Queries;
using FluentValidation;
@@ -19,4 +20,5 @@ public class FetchEmailsQueryValidator : AbstractValidator<FetchEmailsQuery>
.WithMessage("Mail search filter must not be null.")
.SetValidator(new MailSearchFilterValidator());
}
}
}
#endif

View File

@@ -1,3 +1,4 @@
#if NET
using DigitalData.MessagingService.Application.Common.Models.MailSearch;
using FluentValidation;
@@ -48,4 +49,5 @@ public class MailSearchFilterValidator : AbstractValidator<MailSearchFilter>
.SetValidator(new DateFilterValidator()!)
.When(x => x.Date is not null);
}
}
}
#endif

View File

@@ -1,4 +1,5 @@
using DigitalData.MessagingService.Application.Common.Models.MailSearch;
#if NET
using DigitalData.MessagingService.Application.Common.Models.MailSearch;
using FluentValidation;
namespace DigitalData.MessagingService.Application.EmailReceiving.Validators;
@@ -45,4 +46,5 @@ public class UidFilterValidator : AbstractValidator<UidFilter>
.WithMessage("Uid.Min must be less than or equal to Uid.Max.")
.When(x => x.Min is not null && x.Max is not null);
}
}
}
#endif

View File

@@ -1,3 +1,4 @@
#if NET
using AutoMapper;
using DigitalData.MessagingService.Application.EmailAccount.Queries;
using DigitalData.MessagingService.Domain.Exceptions;
@@ -69,4 +70,5 @@ public class PublishEmailCommandHandler(ISender Sender, ISendingEmailPublisher P
await Publisher.EnqueueAsync(sendingEmailEvent, cancellationToken);
return sendingEmailEvent.Id;
}
}
}
#endif

View File

@@ -1,3 +1,4 @@
#if NET
using DigitalData.MessagingService.Application.EmailSending.Commands;
using FluentValidation;
@@ -32,3 +33,4 @@ public class PublishEmailCommandValidator : AbstractValidator<PublishEmailComman
.WithMessage("Body is required");
}
}
#endif