2017-04-25 21 views
1

我有要映射的類,但它們沒有默認構造函數,我不希望它們具有。這是因爲我只映射到已有的對象。AutoMapper在驗證過程中拋出「沒有默認構造函數」

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:未映射成員 發現。查看下面的類型和成員。添加自定義映射 表達,忽略,添加自定義解析器,或者修改 源/目標類型對於沒有匹配的構造中,添加一個無參數 構造函數,添加可選參數,或映射所有的構造參數的

Order - > OrderProcessor(目標成員列表)

沒有可用的構造函數。

在測試()在Tests.cs:行

如何進行配置斷言通和失敗的原因時,我不希望創建新的對象?

回答

2

我也是無意中發現了這個問題,最近從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. 
    // 
+0

賓果,這正是我所尋找的。經過測試和工作。謝謝。 –

-1

您需要使用.ConstructUsing(),爲你的類型沒有參數的構造函數...

因此,像;

​​

您可能顯然需要WhateverService使用任何DI框架您使用的解決....

+0

我在現實中訂單處理器有對夫婦更依賴。在映射過程中手動解析它們不是一種方法。另外,實際上OrderProcessor是一個ViewModel,它不能被重新創建(對於我使用簡單版本的示例)。 –

+0

這實際上是唯一的'走的路',所以祝你好運! – Milney

+0

你是什麼意思,'不能重新創建'?不幸的是,你必須要麼這樣做,要麼不使用Automapper ... – Milney

相關問題