自动映射器在验证期间抛出"No default constructor"



我有要映射的类,但是它们没有默认的构造函数,我不希望它们拥有。这是因为我仅映射到/从已经存在的对象映射。

public class Order
{
    public string OrderName { get; set; }
    public Order(string name) 
    { 
        this.OrderName = name; 
    }
}
public class OrderProcessor
{
    private IService service;
    public string OrderName { get; set; }
    public OrderProcessor(IService service)
    { 
        this.service = service; 
        Mapper.Initialize(config => config.CreateMap<Order, OrderProcessor>());
    }
    public void Init()
    { 
        var order = this.service.GetOrder();
        // this works
        Mapper.Map(order, this);
        // this fails
        Mapper.Configuration.AssertConfigurationIsValid();
    }
}

automapper.automappercerconfigurationException:未映射的成员是 成立。查看下面的类型和成员。添加自定义映射 表达式,忽略,添加自定义解析器或修改 源/目标类型无匹配的构造函数,添加no-arg ctor,添加可选参数或映射所有构造函数参数

订单 -> OrderProcessor(目标成员列表(

没有可用的构造函数。

test((in tests.cs:line

如何使配置通过,为什么当我不想创建新对象时它会失败?

我最近在最近升级为6.x。

后,偶然发现了这个问题。

您需要告诉自动应用程序您不打算通过调用CreateMap<TSource, TDest>().DisableCtorValidation()

来构建目标类型

根据方法文档:

    // Summary:
    //     Disable constructor validation. During mapping this map is used 
    //     against an existing destination object and never constructed itself.
    //

您需要使用.constructing((,因为您的类型没有无参数的构造函数...

所以类似;

 Mapper.Initialize(config => 
    config.CreateMap<Order, OrderProcessor>()
    .ConstructUsing(x => new OrderProcessor(new WhateverService()));
);

显然,您可能需要使用所使用的任何DI框架来解决WhateVerservice ..

相关内容

最新更新