I Use Automapper 5.2.0 In My Project. When I Use ProjectTo()
In Code Get This Error:
Mapper not initialized. Call Initialize with Appropriate configuration. If you are trying to use mapper instances through a container or otherwise, make sure you do not have any calls to the static Mapper.Map methods, and if you're using ProjectTo or UseAsDataSource extension methods, make sure you pass in the appropriate IConfigurationProvider instance.
Service Code
public async Task<FreelancerProfileViewModel> GetFreelancerProfile()
{
var id = Guid.Parse(_identity.GetUserId());
var model = await _freelancerProfiles
.AsNoTracking()
.Where(_ => _.User.Id == id)
.ProjectTo<FreelancerProfileViewModel>()
.FirstAsync();
// var viewmodel = _mapper.Map<FreelancerProfileViewModel>(model);
return model;
}
Automapper Profile
public class FreelancerDashbordProfile : Profile
{
private readonly IIdentity _identity;
public FreelancerDashbordProfile(IIdentity identity)
{
_identity = identity;
var id = Guid.Parse(_identity.GetUserId());
CreateMap<FreelancerProfile, FreelancerProfileViewModel>()
.ForMember(_ => _.DoingProjectCount,
__ => __.MapFrom(_ => _.Projects.Count(project => project.ProjectState == ProjectState.Doing)))
.ForMember(_ => _.EndProjectCount,
__ => __.MapFrom(_ => _.Projects.Count(project => project.ProjectState == ProjectState.End)))
.ForMember(_ => _.ProjectCount, __ => __.MapFrom(_ => _.Projects.Count));
}
}
Also I Use StructureMap For IoC
AutoMapperRegistery
public AutoMapperRegistery()
{
this.Scan(scan =>
{
scan.TheCallingAssembly();
scan.AssemblyContainingType<SkillProfile>(); // for other asms, if any.
scan.WithDefaultConventions();
scan.AddAllTypesOf<Profile>().NameBy(item => item.FullName);
});
this.For<MapperConfiguration>().Singleton().Use("MapperConfig", ctx =>
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMissingTypeMaps = true; // It will connect `Person` & `PersonViewModel` automatically.
addAllCustomAutoMapperProfiles(ctx, cfg);
});
config.AssertConfigurationIsValid();
return config;
});
this.For<IMapper>()
.Singleton()
.Use(ctx => ctx.GetInstance<MapperConfiguration>().CreateMapper(ctx.GetInstance));
}
You need to pass the MappingConfiguration provider to the ProjectTo call.
public async Task<FreelancerProfileViewModel> GetFreelancerProfile()
{
var id = Guid.Parse(_identity.GetUserId());
var model = await _freelancerProfiles
.AsNoTracking()
.Where(_ => _.User.Id == id)
.ProjectTo<FreelancerProfileViewModel>(_mapper.Configuration)
.FirstAsync();
// var viewmodel = _mapper.Map<FreelancerProfileViewModel>(model);
return model;
}