AutoMapper:mappatura a setter privati ​​contenuti in oggetti nidificati definiti dalle interfacce

AutoMapper:mappatura a setter privati ​​contenuti in oggetti nidificati definiti dalle interfacce

Soluzione per AutoMapper:la mappatura ai setter privati ​​contenuti negli oggetti nidificati definiti dalle interfacce
è riportata di seguito:

Ho creato un'app console che riflette il problema che sto riscontrando.
Voglio :

  1. Essere in grado di mappare le proprietà di sola lettura (quelle con setter privati)
  2. Fai in modo che queste proprietà siano all'interno di oggetti nidificati
  3. Fai in modo che quegli oggetti annidati siano dichiarati come un'interfaccia all'interno della loro classe genitore

Non riesco a ottenere tutto quanto sopra allo stesso tempo. Ecco il codice di esempio:

using AutoMapper;
using System;

namespace ConsoleApp5
{
    class Program
    {
        static void Main(string[] args)
        {
            var dbCvg = new DbCoverage("123", "b", "blue", new DbChild(5, 9));

            var config = new MapperConfiguration(cfg => {
                cfg.CreateMap<IDbCoverage, Coverage>();
                cfg.CreateMap<IDbChild, IChild>();
            });

            var mapper = new Mapper(config);

            var destClass = mapper.Map<Coverage>(dbCvg);

            Console.WriteLine(destClass.ExternalMemberId);
            Console.WriteLine(destClass.CoverageCode);
            Console.WriteLine(destClass.ReadOnlyDesc);

            Console.WriteLine(destClass.Child.someValue);
            Console.WriteLine(destClass.Child.readOnlyValue);
        }
    }

    public interface IDbCoverage
    {
        string ExternalMemberId { get; set; }
        string CoverageCode { get; set; }
        string ReadOnlyDesc { get; }
        IDbChild Child { get; set; }
    }


    public interface IDbChild
    {
        int someValue { get; set; }
        int readOnlyValue { get; }
    }

    public interface ICoverage
    {
        string ExternalMemberId { get; set; }
        string CoverageCode { get; set; }
        string ReadOnlyDesc { get; }
        IChild Child { get; set; }
    }

    public interface IChild
    {
        int someValue { get; set; }
        int readOnlyValue { get; }
    }

    public class Coverage : ICoverage
    {
        public string ExternalMemberId { get; set; }
        public string CoverageCode { get; set; }
        public string ReadOnlyDesc { get; private set; }
        public IChild Child { get; set; } 
    }

    public class Child : IChild
    {
        public int someValue { get; set; }
        public int readOnlyValue { get; private set; }
    }

    public class DbCoverage : IDbCoverage
    {
        public string ExternalMemberId { get; set; }
        public string CoverageCode { get; set; }
        public string ReadOnlyDesc { get; private set; }
        public IDbChild Child { get; set; }

        public DbCoverage(string Id, string code, string desc, IDbChild child)
        {
            ExternalMemberId = Id;
            CoverageCode = code;
            ReadOnlyDesc = desc;
            Child = child;
        }
    }

    public class DbChild : IDbChild
    {
        public int someValue { get; set; }
        public int readOnlyValue { get; private set; }

        public DbChild(int smVal, int roVal)
        {
            someValue = smVal;
            readOnlyValue = roVal;
        }
    }
}

Quando viene eseguito, possiamo vedere che la riga finale di output è 0 anziché 9 perché il 9 non è stato mappato.
Ciò è dovuto al fatto che la mappatura è da IDbChild -> IChild e IChild non ha un setter per quella proprietà.

Tuttavia, se invece provo a mappare IDbChild -> Child, ottengo un errore di compilazione che credo sia dovuto al fatto che la proprietà Child nidificata nell'oggetto Coverage è definita come un'interfaccia e quindi vuole una mappatura IDbChild -> IChild.

Esiste un modo per modificare la configurazione della mappatura (ma ​​non gli oggetti sottostanti ) per farlo funzionare?

La mappatura delle interfacce complica solo le cose. Ma è possibile.

    cfg.CreateMap<IDbChild, Child>();
    cfg.CreateMap<IDbChild, IChild>().As<Child>();

https://docs.automapper.org/en/latest/Mapping-inheritance.html


No