配置Automapper配置文件类与参数构造函数和Ninject

本文关键字:构造函数 Ninject 参数 Automapper 配置文件 配置 | 更新日期: 2023-09-27 18:09:05

我使用Automapper (v5.1.1.0)和Ninject (v3.2.0.0)。我的Profile类是:

public class ApplicationUserResponseProfile : Profile
{
    public ApplicationUserResponseProfile(HttpRequestMessage httpRequestMessage) 
    {
        UrlHelper urlHelper = new UrlHelper(httpRequestMessage);
        CreateMap<ApplicationUser, ApplicationUserResponseModel>()
            .ForMember(dest => dest.Url, opt => opt.MapFrom(src => urlHelper.Link("GetUserById", new { id = src.Id })));
    }
    public ApplicationUserResponseModel Create(ApplicationUser applicationUser)
    {
        return Mapper.Map<ApplicationUserResponseModel>(applicationUser);
    }
}

和AutoMapperWebConfiguration是:

Mapper.Initialize(cfg =>
        {
            cfg.AddProfile<ApplicationUserResponseProfile>(); // unable to configure
        });

我也尝试将它绑定到Ninject kernel:

var config = new MapperConfiguration(
            c =>
            {
                c.AddProfile(typeof(ApplicationUserResponseProfile));
            });
var mapper = config.CreateMapper();
kernel.Bind<IMapper>().ToConstant(mapper);

和不同的方式:

Mapper.Initialize(cfg =>
        {
            cfg.ConstructServicesUsing((type) => kernel.Get(type));
            cfg.AddProfile(typeof(ApplicationUserResponseProfile));
        });

但两种方式都出错-

没有为这个对象定义无参数构造函数

请帮帮我。我无法与Ninject配置AutoMapper配置文件类(具有参数)。有什么不同的方法来解决这个问题吗?

配置Automapper配置文件类与参数构造函数和Ninject

我已经用不同的方法解决了这个问题。我已经将automapper从静态方法迁移到Profile方法。

public class ApplicationUserResponseFactory
{
    private MapperConfiguration _mapperConfiguration;
    public ApplicationUserResponseFactory(HttpRequestMessage httpRequestMessage) 
    {
        UrlHelper urlHelper = new UrlHelper(httpRequestMessage);
        _mapperConfiguration = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<ApplicationUser, ApplicationUserResponseModel>()
                .ForMember(dest => dest.Url, opt => opt.MapFrom(src => UrlHelper.Link("GetUserById", new { id = src.Id })));
        });
    }
    public ApplicationUserResponseModel Create(ApplicationUser applicationUser)
    {
        return _mapperConfiguration.CreateMapper().Map<ApplicationUserResponseModel>(applicationUser);
    }
}

我在这里找到了迁移过程

你可以这样创建一个解析器:

public class YourResolver : IValueResolver<ApplicationUser, ApplicationUserResponseModel, string>
{
    HttpRequestMessage HttpRequestMessage { get; }
  
    public YourResolver(HttpRequestMessage httpRequestMessage)
    {
      HttpRequestMessage = httpRequestMessage;
    }
  
    public string Resolve(ApplicationUser source, ApplicationUserResponseModel destination, string destMember, ResolutionContext context)
    {
       //do something with your HttpRequestMessage and return a value;
    }
}

然后在Profile中:

public class ApplicationUserResponseProfile : Profile
{
    public ApplicationUserResponseProfile()
    {
        CreateMap<ApplicationUser, ApplicationUserResponseModel>()
                 .ForMember(dest => dest.Url, opt => opt.MapFrom<YourResolver>());
    }
}

来源:https://docs.automapper.org/en/stable/Dependency-injection.html