AutoMapper自定义解析器在构造函数中询问可选参数 [英] AutoMapper Custom Resolver asking for optional parameters in constructor

查看:67
本文介绍了AutoMapper自定义解析器在构造函数中询问可选参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在AutoMapper中的自定义解析器上遇到一些问题.我正在将接口传递给存储库的构造函数,但始终收到以下错误:

I am having some issues with a custom resolver in AutoMapper. I am passing in a interface to the constructor of my repository but i keep getting the following error:

Type needs to have a constructor with 0 args or only optional args
Parameter name: type

我可以通过创建一个无参数的构造函数并在其中对我的仓库的具体实现进行硬编码来解决它,但是我想注入它.

I can get around it by creating a parameter-less constructor and hard coding the concrete implementation of my repo in there, but i want to inject it.

我的解析器:

public class OptionGroupProjectionResolver : ValueResolver<Product, List<OptionGroupProjection>>
{
    private readonly IOptionGroupRepository _optionGroupRepository;

    public OptionGroupProjectionResolver(IOptionGroupRepository optionGroupRepository)
    {
        _optionGroupRepository = optionGroupRepository;
    }

    protected override List<OptionGroupProjection> ResolveCore(Product source)
    {
        var groupIds = new List<int>();
        var optIds = new List<int>();

        foreach (var variant in source.Variants)
        {
            groupIds.AddRange(variant.Options.Select(option => option.GroupId).Distinct());
            optIds.AddRange(variant.Options.Select(option => option.Id).Distinct());
        }

        var groups = _optionGroupRepository.GetAll();

        var results = from gr in groups
                      where groupIds.Contains(gr.Id)
                      select new OptionGroupProjection
                      {
                          Id = gr.Id,
                          Name = gr.Name,
                          Options = gr.Options.Where(o => optIds.Contains(o.Id)).ToList()
                      };

        return results.ToList();
    }
}

为回购注入配置

_kernel.Bind<IOptionGroupRepository>().To<OptionGroupRepository>();

映射配置

        Mapper.CreateMap<Product, ProductDetailsViewModel>()
            .ForMember(
                dest => dest.DefaultImage,
                opt => opt.MapFrom(src => src.Images.OrderBy(i => i.SortOrder).FirstOrDefault())
            )
            .ForMember(
                dest => dest.SelectOptionGroups,
                opt => opt.ResolveUsing<OptionGroupProjectionResolver>()
            );

我真的看不到我能做些什么,我确信我的Google技能使我今天犯了错误.

I can't really see what i can do, i am sure i have set something up wrong by my Google skills are failing me today.

推荐答案

在引导/初始化代码中,您需要告诉AutoMapper如何解决依赖关系.我没有使用过Ninject,但是可能是这样的:

Inside of your bootstrapping/initialization code, you need to tell AutoMapper how to resolve dependencies. I haven't used Ninject, but it might be something like this:

AutoMapper.Mapper.Configuration.ConstructServicesUsing(t => _kernel.Get(t));

lambda是AutoMapper将在运行时执行以解决依赖关系的东西.

The lambda is what AutoMapper will execute to resolve dependencies at runtime.

这篇关于AutoMapper自定义解析器在构造函数中询问可选参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆