I need to use a service layer in the AutoMapper
profile class in ASP.NET Core
but when I inject service in the constructor it does not work. For example:
public class UserProfile : Profile
{
private readonly IUserManager _userManager;
public UserProfile(IUserManager userManager)
{
_userManager = userManager;
CreateMap<User, UserViewModel>()
.ForMember(dest => dest.FullName, opt => opt.MapFrom(src => $"{src.FirstName} {src.LastName}"));
}
}
And in Startup
Class:
public class Startup
{
public IConfigurationRoot Configuration { set; get; }
public Startup(IHostingEnvironment env)
{
//some code
}
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddMvc();
services.AddScoped<IUsersPhotoService, UsersPhotoService>();
services.AddAutoMapper(typeof(UserProfile));
}
}
How do to do it?
It's better to use custom IValueResolver for this purposes because it is fully supports IServiceCollection integration (using AutoMapper.Extensions.Microsoft.DependencyInjection).
You may need to implement a custom value resolver:
And the registration in services may be reduced to:
Then you can get a mapper instance inside a controller by injecting
IMapper
via a constructor.Based on: AutoMapper: Handling Profile Dependencies using Custom Value Resolvers - Tech Net
To solve your problem you just need to wire
IUserManager
in DI, and make sureUserProfile
dependency is resolved.And having that said, I would probably try to keep single responsibility per class, and not have any services injected into mapping profiles. You can populate your objects just before the mapping instead. This way it might be easier to unit test as well.