From 9e9d4e06fd85fc889a795e9272e3ccf52126718b Mon Sep 17 00:00:00 2001 From: Polianin Nikita Date: Mon, 8 Jan 2024 16:11:01 +0300 Subject: [PATCH] feat: add mapping --- Application/Application.csproj | 4 +++ .../Common/Mappings/AssemblyMappingProfile.cs | 28 +++++++++++++++++++ Application/Common/Mappings/IMapWith.cs | 9 ++++++ Application/DependencyInjection.cs | 4 +-- 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 Application/Common/Mappings/AssemblyMappingProfile.cs create mode 100644 Application/Common/Mappings/IMapWith.cs diff --git a/Application/Application.csproj b/Application/Application.csproj index c03a6c1..2003517 100644 --- a/Application/Application.csproj +++ b/Application/Application.csproj @@ -13,6 +13,10 @@ + + + + diff --git a/Application/Common/Mappings/AssemblyMappingProfile.cs b/Application/Common/Mappings/AssemblyMappingProfile.cs new file mode 100644 index 0000000..68a9e8e --- /dev/null +++ b/Application/Common/Mappings/AssemblyMappingProfile.cs @@ -0,0 +1,28 @@ +using AutoMapper; +using System; +using System.Linq; +using System.Reflection; + +namespace Mirea.Api.DataAccess.Application.Common.Mappings; + +public class AssemblyMappingProfile : Profile +{ + public AssemblyMappingProfile(Assembly assembly) => + ApplyMappingsFromAssembly(assembly); + + private void ApplyMappingsFromAssembly(Assembly assembly) + { + var types = assembly.GetExportedTypes() + .Where(type => type.GetInterfaces() + .Any(i => i.IsGenericType && + i.GetGenericTypeDefinition() == typeof(IMapWith<>))) + .ToList(); + + foreach (var type in types) + { + var instance = Activator.CreateInstance(type); + var methodInfo = type.GetMethod("Mapping"); + methodInfo?.Invoke(instance, new[] { this }); + } + } +} \ No newline at end of file diff --git a/Application/Common/Mappings/IMapWith.cs b/Application/Common/Mappings/IMapWith.cs new file mode 100644 index 0000000..390e4e0 --- /dev/null +++ b/Application/Common/Mappings/IMapWith.cs @@ -0,0 +1,9 @@ +using AutoMapper; + +namespace Mirea.Api.DataAccess.Application.Common.Mappings; + +public interface IMapWith +{ + void Mapping(Profile profile) => + profile.CreateMap(typeof(T), GetType()); +} \ No newline at end of file diff --git a/Application/DependencyInjection.cs b/Application/DependencyInjection.cs index 2686e15..61c3eab 100644 --- a/Application/DependencyInjection.cs +++ b/Application/DependencyInjection.cs @@ -1,8 +1,8 @@ -using MediatR; using FluentValidation; +using MediatR; using Microsoft.Extensions.DependencyInjection; -using System.Reflection; using Mirea.Api.DataAccess.Application.Common.Behaviors; +using System.Reflection; namespace Mirea.Api.DataAccess.Application;