2013-06-13 10 views
10

私は別のサービスを呼び出すサービスを持っています。どちらのサービスも「同じクラス」を使用しています。クラスは同じ名前で同じプロパティを持ちますが、名前空間が異なりますので、AutoMapperを使用してタイプの1つから別のタイプにマッピングする必要があります。AutoMapper auto create createMap

私がしなければならないのはCreateMap<>ですが、私は手作業でCreateMap<>を書く必要がある何百ものクラスがあり、それは私に配線されています。何も自動CreateMap機能はありませんか?だから私はCreateMap()と言うならば、AutoMapperの組織スルーworkesとは、すべてのクラスを検出し、自動的にこれらのクラスのCreateMapを行い、それがサブクラスがなどなど...、または私はいくつかの反射を推測するシンプルなソリューションのための

希望はそれを修正することができます。..

答えて

4

AutoMapperには、使用することができるDynamicMapメソッドがあります。これを示すユニットテストの例です。

[TestClass] 
public class AutoMapper_Example 
{ 
    [TestMethod] 
    public void AutoMapper_DynamicMap() 
    { 
     Source source = new Source {Id = 1, Name = "Mr FooBar"}; 

     Target target = Mapper.DynamicMap<Target>(source); 

     Assert.AreEqual(1, target.Id); 
     Assert.AreEqual("Mr FooBar", target.Name); 
    } 

    private class Target 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    private class Source 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 
+1

DynamicMapが廃止され、 'Mapper.Map (fooは、=> opts.CreateMissingTypeMaps =真付き合え)'推奨代替手段です。 – PeteGO

17

ちょうどのオプションにtrueにCreateMissingTypeMapsを設定します。

var dto = Mapper.Map<FooDTO> 
    (foo, opts => opts.CreateMissingTypeMaps = true); 

あなたは、多くの場合、それを使用する必要がある場合は、デリゲートフィールドにラムダを格納します。

static readonly Action<IMappingOperationOptions> _mapperOptions = 
    opts => opts.CreateMissingTypeMaps = true; 

... 

var dto = Mapper.Map<FooDTO>(foo, _mapperOptions); 

UPDATE :

前述のproachはAutoMapperの最近のバージョンでは動作しなくなりました。 、あなたの古い静的APIを使用して保存しておきたい場合は(もはや推奨)

var config = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMissingTypeMaps = true; 
    // other configurations 
}); 
var mapper = config.CreateMapper(); 

代わりに、あなたは真のCreateMissingTypeMapsセットでマッパー設定を作成し、この構成からマッパーのインスタンスを作成する必要がありますこれを行うこともできます:

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMissingTypeMaps = true; 
    // other configurations 
}); 
+0

これにはグローバル設定がありますか? –

+0

@ChadKapatch、私が知りません –

+0

@ThomasLevesque:私のためには動作しません、これらのようなエラーを出し、 'CreateMissingTypeMaps'の定義を含んでおらず、タイプの最初の引数を受け入れる拡張メソッドが見つかりませんでした。何か案が? – Bharat

2

CreateMissingTypeMapsはあなたのプロフィール内で設定できます。ただし、マッピングごとにCreateMapを明示的に使用し、サイレントエラーを防ぐために各プロファイルの単体テストでAssertConfigurationIsValidを呼び出すことをお勧めします。

public class MyProfile : Profile { 
    CreateMissingTypeMaps = true; 

    // Mappings... 
} 
+0

これは私にとってはうまくいきました。初期化が機能しませんでした。 – aeroson

関連する問題