AutoMapper mapping from a JSON string to IEnumerable of strings

CSharp · Console

/Program.cs

using AutoMapper;
using AgileObjects.ReadableExpressions;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Domain.Entities;
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Linq;
					
public class Program
{
	public static void Main()
	{
		// Setup
		var serviceProvider = new ServiceCollection()
			.AddAutoMapper(typeof(DbEntityToDomainModelProfile))
			.BuildServiceProvider();
		
		// Usage
		var mapper = serviceProvider.GetService<IMapper>();
		
		var executionPlan = mapper.ConfigurationProvider.BuildExecutionPlan(typeof(UserRolesEntity), typeof(UserRoles));
		var description = executionPlan.ToReadableString();
		
		Console.WriteLine("--- Execution Plan ---");
		Console.WriteLine(description);
		Console.WriteLine("--- End Execution Plan ---");
		Console.WriteLine();
				
		var dbEntities = new List<UserRolesEntity>
		{
			new UserRolesEntity 
			{ 
				Id = Guid.NewGuid(), 
				Email = "[email protected]",
				Roles = @"[""administrator"", ""superadmin"", ""techcorner""]"
			},
			new UserRolesEntity 
			{ 
				Id = Guid.NewGuid(), 
				Email = "[email protected]",
				Roles = @"[""SystemConsoleAdministrator"", ""TelematicsEngineer"", ""OpsManager"", ""OpsEngineer""]"
			}
		};
		
		var domainModels = mapper.Map<List<UserRoles>>(dbEntities);
		
		Console.WriteLine(domainModels.GetType());
		
		foreach (var dd in domainModels)
		{
			Console.WriteLine(dd);	
		}
	}
	
	public class UserRoles : AggregateRoot<Guid>
	{
		public string Email { get; private set; }
		public IEnumerable<string> Roles { get; private set; }
		
		public UserRoles(Guid id, string email, IEnumerable<string> roles) : base(id)
		{
			Email = email;
			Roles = roles;
		}
		
		public override string ToString()
		{
			return System.Text.Json.JsonSerializer.Serialize(this);
		}
	}
	
	public class UserRolesEntity
	{
		public Guid Id { get; set; }
		public string Email { get; set; }
		public string Roles { get; set; }
	}
	
	public class DbEntityToDomainModelProfile : Profile
	{
		public DbEntityToDomainModelProfile()
		{
			CreateMap<UserRolesEntity, UserRoles>()
				.ForMember(dest => dest.Roles, opt => opt.MapFrom<JsonStringToUserRolesResolver>());
		}
	}
	
	public class JsonStringToUserRolesResolver : IValueResolver<UserRolesEntity, UserRoles, IEnumerable<string>>
    {
        public IEnumerable<string> Resolve(UserRolesEntity source, UserRoles destination, IEnumerable<string> destMember, ResolutionContext context)
        {
            var userRoles = JsonSerializer.Deserialize<IEnumerable<string>>(source.Roles);
            if (userRoles == null)
            {
                return Enumerable.Empty<string>();
            }

            return userRoles;
        }
    }
}
;