18

私はかなりの数のエンティティを持っており、これまでのところ、私は次のようなことをやっています

Mapper.CreateMap<Employee, EmployeeDetailsDTO>()
    .ForSourceMember(mem => mem.NewsPosts, opt => opt.Ignore());

AutoMapperに、宛先オブジェクトで欠落しているプロパティをそれぞれ指定せずに単に無視するように指示したいと思います。これまでのところ、複数のSO検索とGoogle検索でこれを行う方法を見つけていません。誰かが解決策を持っていますか?一度記述でき、model / dtoの変更または追加されたプロパティに合わせて拡張できる限り、ある種のループなどを実行する準備ができています。

4

3 に答える 3

11

エラーはいつ発生しますか?電話する時ですAssertConfigurationIsValidか?

はいの場合は、このメソッドを呼び出さないでください

このメソッドを呼び出す必要はありません。機能する次のマッピングを検討してください。

public class Foo1
{
    public string Field1 { get; set; }
}
public class Foo2
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
}

Mapper.CreateMap<Foo1, Foo2>();
var foo1 = new Foo1() {Field1 = "field1"};
var foo2 = new Foo2();
Mapper.Map(foo1, foo2);//maps correctly, no Exception

他のマッピングを呼び出しAssertConfigurationIsValidて、それらが正しいことを確認することもできます。代わりに、マッピングをプロファイルに整理する必要があります。

public class MyMappedClassesProfile: Profile
{
    protected override void Configure()
    {
        CreateMap<Foo1, Foo2>();
        //nb, make sure you call this.CreateMap and NOT Mapper.CreateMap
        //I made this mistake when migrating 'static' mappings to a Profile.    
    }
}

Mapper.AddProfile<MyMappedClassesProfile>();

次に、マッピングの有効性を確認する場合(状況に応じてケースバイケースで)、

Mapper.AssertConfigurationIsValid(typeof(MyMappedClassesProfile).FullName);

重要なのは、電話をかけない場合や、電話をかけない場合は、 AutoFixtureや単体テストAssertConfigurationIsValidなどを使用してマッピングが機能していることを確認する必要があります。(これはの意図です)AssertConfigurationIsValid

于 2012-11-13T12:59:31.860 に答える
7

walの回答で示唆されているように、「AssertConfigurationIsValid()を呼び出さないでください」は、マッピングの潜在的なエラーを隠すため、安全ではありません。
クラス間のマッピングを明示的に無視することをお勧めします。これにより、必要なすべてのプロパティがすでに正しくマッピングされていることが確実になります。AutoMapperで作成された拡張機能を使用できます:「残りを無視する」?答え:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Src, Dest>();
     cfg.IgnoreUnmapped<Src, Dest>();  // Ignores unmapped properties on specific map
});

パラメータなしのオーバーロードcfg.IgnoreUnmapped(this IProfileExpression profile) は、すべてのマップのマップされていないプロパティを無視し、すべてのクラスの潜在的な問題も隠すため、お勧めしません。

于 2016-07-17T13:16:55.350 に答える
0

無視するプロパティが多数あるクラスが多数ある場合は、AssertConfigurationIsValid()を呼び出すときに例外を発生させたくありませんが、ログに報告して、マップされていないプロパティがすべて意図的に失われていることを確認することをお勧めします。検証を行うメソッドはAutoMapperによって公開されていないため、AssertConfigurationIsValidをキャッチし、エラーメッセージを文字列として返します。

    public string ValidateUnmappedConfiguration(IMapper mapper)
    {
        try
        {
            mapper.ConfigurationProvider.AssertConfigurationIsValid();
        }
        catch (AutoMapperConfigurationException e)
        {
              return e.Message;
        }
        return "";
    }

単体テストからValidateUnmappedConfigurationメソッドを呼び出しています

   [TestMethod]
    public void LogUmmappedConfiguration()
    {
        var mapper = new MapperConfiguration((cfg =>
        {
            cfg.AddProfile(new AutoMapperProfile());
        })).CreateMapper();
        var msg=ValidateUnmappedConfiguration(mapper) ;
        if (!msg.IsNullOrBlank())
        {
            TestContext.WriteString("Please review the list of unmapped fields and check that it is intentional: \n"+msg);
        }
    }
于 2018-09-08T06:36:08.933 に答える