using System.Collections.Generic;
using Microsoft.AspNetCore.Identity;
using QuickAuditPro.Services.Core;
public static void Main()
IdentityResultMapper.Configuration.AssertConfigurationIsValid();
var idres = IdentityResult.Failed(new IdentityError[]
new IdentityError { Code = "Error1", Description = "Error desc..." }
Console.WriteLine("IdRes = {0}", idres);
var opres = idres.ToOperationResult();
Console.WriteLine("OpRes = {0}", opres);
var opres2 = IdentityResult.Success.ToOperationResult(200);
Console.WriteLine("OpRes2 = {0}, {1}", opres2, opres2.ReturnValue);
namespace QuickAuditPro.Services.Core
public static class IdentityResultMapper
static IdentityResultMapper()
Mapper = new MapperConfiguration(cfg =>
cfg.AddProfile<IdentityResultMapperProfile>();
public static IConfigurationProvider Configuration => Mapper.ConfigurationProvider;
public static IMapper Mapper { get; }
public static OperationResult ToOperationResult(this IdentityResult result)
return Mapper.Map<IdentityResult, OperationResult>(result);
public static OperationResult<T> ToOperationResult<T>(this IdentityResult result, T returnValue)
return OperationResult<T>.Success(returnValue);
return OperationResult<T>.Failed(result.Errors.ToOperationErrors().ToArray());
public static OperationError ToOperationError(this IdentityError error)
return Mapper.Map<IdentityError, OperationError>(error);
public static IEnumerable<OperationError> ToOperationErrors(this IEnumerable<IdentityError> error)
return Mapper.Map<IEnumerable<IdentityError>, IEnumerable<OperationError>>(error);
public class IdentityResultMapperProfile : Profile
public IdentityResultMapperProfile()
CreateMap<IdentityResult, OperationResult>()
.ConstructUsing((src, ctx) =>
return OperationResult.Success;
return OperationResult.Failed(src.Errors.ToOperationErrors().ToArray());
CreateMap<IdentityError, OperationError>()
public class OperationError
public string Code { get; set; }
public string Description { get; set; }
public class OperationResult
private List<OperationError> _errors = new List<OperationError>();
public bool Succeeded { get; protected set; }
public IEnumerable<OperationError> Errors => _errors;
#region Static Success/Failed
public static OperationResult Success => new OperationResult { Succeeded = true };
public static OperationResult Failed(params OperationError[] errors)
var result = new OperationResult { Succeeded = false };
result.AddErrors(errors);
public override string ToString()
string.Format("Failed : {0}", string.Join(", ", Errors.Select(x => x.Code).ToList()));
protected void AddErrors(params OperationError[] errors)
_errors.AddRange(errors);
public class OperationResult<T> : OperationResult
public T ReturnValue { get; protected set; }
public static new OperationResult<T> Success(T returnValue)
var result = new OperationResult<T>()
ReturnValue = returnValue
public static new OperationResult<T> Failed(params OperationError[] errors)
var result = new OperationResult<T> { Succeeded = false };
result.AddErrors(errors);
public class OperationPagedResult<T> : OperationResult<T>
public int TotalRecords { get; protected set; }
public int Page { get; protected set; }
public int PageSize { get; protected set; }
public static new OperationPagedResult<T> Success(T returnValue, int totalRecords, int page, int pageSize)
var result = new OperationPagedResult<T>()
ReturnValue = returnValue,
TotalRecords = totalRecords,
public static new OperationPagedResult<T> Failed(params OperationError[] errors)
var result = new OperationPagedResult<T> { Succeeded = false };
result.AddErrors(errors);