web-dev-qa-db-ja.com

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:マップされていないメンバーが見つかりました。以下のタイプとメンバーを確認してください。カスタムマッピング式の追加、無視、カスタムリゾルバーの追加、またはソース/宛先タイプの変更一致するコンストラクターがない場合は、引数なしのctorを追加するか、オプションの引数を追加するか、すべてのコンストラクターパラメーターをマップします。

Order-> OrderProcessor(宛先メンバーリスト)

使用可能なコンストラクターがありません。

tests.cs:lineのTest()で

構成アサートをパスにする方法と、新しいオブジェクトを作成したくないときに失敗する理由を教えてください。

8
one_mile_run

また、最近Automapper 4.xから6.xにアップグレードした後、この問題に遭遇しました。

CreateMap<TSource, TDest>().DisableCtorValidation()を呼び出して、宛先タイプを構築するつもりはないことをAutoMapperに伝える必要があります。

メソッドのドキュメントによると:

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

タイプにはパラメーターのないコンストラクターがないため、.ConstructUsing()を使用する必要があります。

だから何かのような;

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

使用しているDIフレームワークを使用してWhateverServiceを解決する必要があることは明らかです。

2
Milney