AutoMapper Custom Resolver ขอพารามิเตอร์เสริมในตัวสร้าง

ฉันมีปัญหากับตัวแก้ไขแบบกำหนดเองใน 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 สำหรับ 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 ของฉันทำให้ฉันล้มเหลวในวันนี้


person Modika    schedule 07.05.2014    source แหล่งที่มา
comment
ดูเหมือนว่า Automapper กำลังพยายามสร้าง OptionGroupProjectionResolver ดังนั้นจึงไม่ทราบเกี่ยวกับการกำหนดค่า Ninject ของคุณ   -  person Sign    schedule 07.05.2014
comment
คุณเคยทำให้มันได้ผลไหม? ตอนนี้ฉันมีปัญหาเดียวกันเกือบทุกประการ   -  person Slee    schedule 27.10.2015
comment
ไม่ใช่เพื่อสิ่งนี้เพราะฉันเปลี่ยนการใช้งานเป็นไม่ใช้ repo ในที่สุด แต่ฉันได้ทำสิ่งนี้หลังจาก (ฉันคิดว่า) โดยใช้แอตทริบิวต์ที่เรียกว่า [ImportingConstructor] ฉันคิดว่าฉันได้รับคำตอบจากสิ่งนี้: stackoverflow.com/ คำถาม/4204664/   -  person Modika    schedule 27.10.2015


คำตอบ (1)


ภายในโค้ดการบูตสแตรปปิ้ง/การเริ่มต้น คุณต้องบอก AutoMapper ถึงวิธีแก้ไขการขึ้นต่อกัน ฉันไม่ได้ใช้ Ninject แต่อาจเป็นดังนี้:

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

แลมบ์ดาคือสิ่งที่ AutoMapper จะดำเนินการเพื่อแก้ไขการขึ้นต่อกันในขณะรันไทม์

person Andrew Whitaker    schedule 09.05.2014
comment
จะตรวจสอบสิ่งนั้นแล้วกลับมา - person Modika; 10.05.2014