12

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

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.AutoMapperConfigurationException :找到未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析器或修改源/目标类型对于没有匹配的构造函数,添加无参数 ctor、添加可选参数或映射所有构造函数参数

Order -> OrderProcessor(目标成员列表)

没有可用的构造函数。

在 Tests.cs:line 中的 Test()

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

4

2 回答 2

25

最近从 Automapper 4.x 升级到 6.x 后,我也偶然发现了这个问题。

你需要告诉 AutoMapper 你不打算让它通过调用来构造目标类型CreateMap<TSource, TDest>().DisableCtorValidation()

根据方法文档:

    // Summary:
    //     Disable constructor validation. During mapping this map is used 
    //     against an existing destination object and never constructed itself.
    //
于 2017-07-04T13:02:02.807 回答
3

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

所以像;

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

您可能显然需要使用您正在使用的任何 DI 框架来解析 WhatService....

于 2017-04-25T09:43:08.887 回答