Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inject parameter into automapper custom ValueResolver using Ninject

I'm using automapper library to convert my Model into my ViewModel. For each Model, I create profile which inside i add my maps using CreateMap.

I want to use custom ValueResolver in which it will get the logged user ID from IContext, so i need to pass implementation of IContext using Ninject.

Inside my profile class:

Mapper.CreateMap<ViewModel, BusinessModel>()
.ForMember(dest => dest.ManagerId, opt => opt.ResolveUsing<GetManagerResolver>());

Then my GetManagerResolver:

public class GetManagerResolver : ValueResolver<BusinessModel, int>
{
    private IContext context;
    public GetManagerResolver(IContext context)
    {
        this.context = context;
    }

    protected override int GetManagerResolver(BusinessModel source)
    {
        return context.UserId;
    }
}

But i get this exception message {"Type needs to have a constructor with 0 args or only optional args\r\nParameter name: type"}.

Any Ideas on how make automapper use ninject for object creation?

UPDATE My code to add automapper configuration:

public static class AutoMapperWebConfiguration
{
    public static void Configure()
    {
        Mapper.Initialize(cfg =>
        {            
            cfg.AddProfile(new Profile1());         
            cfg.AddProfile(new Profile2());

            // now i want to add this line, but how to get access to kernel in static class?
            // cfg.ConstructServicesUsing(t => Kernel.Get(t));
        });
    }
}
like image 910
ebram khalil Avatar asked Jun 30 '14 15:06

ebram khalil


1 Answers

You can use the ConstructedBy function to configure how Automapper should create your GetManagerResolver after calling ResolveUsing:

Mapper.CreateMap<ViewModel, BusinessModel>()
    .ForMember(dest => dest.ManagerId, 
         opt => opt.ResolveUsing<GetManagerResolver>()
                   .ConstructedBy(() => kernel.Get<GetManagerResolver>());

Or you can globally sepecify your Ninject kernel to be used by Automapper when resolving any type with Mapper.Configuration.ConstructServicesUsing method:

Mapper.Configuration.ConstructServicesUsing((type) => kernel.Get(type));
like image 192
nemesv Avatar answered Sep 28 '22 04:09

nemesv