【问题标题】:AutoMapper Custom Resolver asking for optional parameters in constructorAutoMapper 自定义解析器在构造函数中要求可选参数
【发布时间】:2014-05-07 18:46:18
【问题描述】:

我在使用 AutoMapper 中的自定义解析器时遇到了一些问题。我正在将一个接口传递给我的存储库的构造函数,但我不断收到以下错误:

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

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

我的解析器:

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();
    }
}

Ninject Config for Repo

_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 技能今天让我失望了。

【问题讨论】:

  • 看起来 Automapper 正在尝试构造 OptionGroupProjectionResolver,因此它不知道您的 ninject 配置。
  • 你有没有得到这个工作?我现在有几乎完全相同的问题
  • 不是因为我改变了实现最终不使用回购。但是我在(我认为)使用名为 [ImportingConstructor] 的属性之后完成了此操作。我想我从中得到了答案:stackoverflow.com/questions/4204664/…

标签: c# automapper


【解决方案1】:

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

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

lambda 是 AutoMapper 将在运行时执行以解决依赖关系。

【讨论】:

  • 会检查并回来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2018-04-02
  • 2019-02-26
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多