Pertanyaan Bagaimana saya bisa mengkonfigurasi Automapper 4 untuk membolehkan nilai tujuan null


Saya mengalami beberapa masalah bagaimana cara mendapatkannya Automapper 4.2.1 untuk memungkinkan pemetaan jenis di mana nilai tujuan mungkin nol tergantung pada nilai sumber.

Versi lama dari Automapper memungkinkan sebuah AllowNullDestination flag harus diatur melalui konfigurasi Mapper tetapi saya tidak dapat menemukan resep yang setara untuk versi baru dan mekanisme lama konfigurasi melalui objek Mapper statis tampaknya telah usang.

Saya telah mencoba yang berikut tanpa hasil:

  • Mapper.Configuration.AllowNullDestinationValues ​​= true;
  • Mapper.AllowNullDestinationValues ​​= true;
  • Mapper.Initialize (c => c.AllowNullDestinationValues ​​= true);

Ini adalah contoh uji sederhana yang menunjukkan masalah. Ini gagal pada baris terakhir dengan AutoMapperMappingException karena metode Pengganti kembali nol. Saya ingin kedua pemetaan berhasil.

Saya lebih suka menghindari penggunaan .ForMember dalam solusi karena dalam skenario nyata saya mencoba untuk mengatasi, pemetaan antara bool dan 'objek' (sebenarnya kelas khusus) harus diterapkan di seluruh pohon objek.

Meskipun ada beberapa pertanyaan serupa di sini di StackOverflow, saya belum menemukan satu yang mengacu pada versi Automapper terbaru.

Terima kasih sebelumnya atas saran apa pun

using AutoMapper;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace AutoMapperTest
{
    [TestClass]
    public class ExampleTest
    {
        [TestMethod]
        public void NullDestinationCanBeMapped()
        {
            var mapper = new MapperConfiguration(configuration =>
            {
                configuration.CreateMap<Source, Target>();
                //How should the following mapping be modified to pass the test?   
                configuration.CreateMap<bool, object>()
                .Substitute(i => i ? null : new object());
            }).CreateMapper();

            var target1 = mapper.Map<Source, Target>(new Source {Member = false}); //succeeds
            Assert.IsNotNull(target1.Member); //pass
            var target2 = mapper.Map<Source, Target>(new Source {Member = true}); //fails to map with exception
            Assert.IsNull(target2.Member); //not reached
        }
    }

    public class Source
    {
        public bool Member { get; set; }
    }

    public class Target
    {
        public object Member { get; set; }
    }
}

4
2018-04-01 08:28


asal


Jawaban:


Alih-alih menggunakan Pengganti, gunakan ConvertUsing...

     configuration.CreateMap<bool, MyClass>()
     .ConvertUsing(i => i ? null : new object());

0
2018-04-01 09:14