Programación C #, el uso del marco de mapeo de entidades de código abierto EmitMapper

1. Introducción

Una poderosa herramienta personalizable para mapear entidades entre sí. Las entidades pueden ser objetos puros, DataReaders, comandos SQL y lo que necesite. La herramienta genera código en tiempo de ejecución a través de la biblioteca Emit. Es útil para tratar con objetos DTO, capas de acceso a datos, etc.

Ventajas : rápido, fácil de usar, flexible;
desventajas : sin mantenimiento durante 11 años ...

Emit Mapper puede convertir automáticamente los siguientes tipos:

  • Cualquier uso del método ToString () para el procesamiento de cadenas.
  • Utilice los tipos básicos de la clase System.Convert.
  • Los tipos que aceptan valores NULL son tipos de valor y viceversa.
  • La enumeración es su tipo subyacente y viceversa.
  • Enumere a cadena y viceversa.
  • Diferentes tipos de colecciones (Array, ArrayList, List <>, IEnumerable)
  • Clase a estructura y viceversa.
  • Los tipos complejos con miembros anidados complejos utilizan asignaciones recursivas con correspondencias superficiales o profundas.

2. Sitio web

Código fuente del sitio web oficial

3. Utilice

A través de la consola

PM> Install-Package EmitMapper

o:
Inserte la descripción de la imagen aquí

4. Siga los pasos

El configurador de mapas predeterminado puede convertir automáticamente los siguientes tipos:

  • Utilice el método ToString () para cualquier tipo a tipo de cadena;
  • Puede utilizar el tipo primitivo convertido por la clase System.Convert;
  • Tipos que aceptan valores NULL, tipos de enumeración, varios tipos de colecciones, estructuras y clases;
  • Los tipos anidados complejos se convierten de forma recursiva;
  • Si la conversión predeterminada no puede cumplir con los requisitos, el configurador de mapeo predeterminado también le permite especificar convenciones de nomenclatura, constructores personalizados, convertidores personalizados, ignorar miembros, etc.

Inserte la descripción de la imagen aquí

4.1 Mapeo ordinario

Los nombres de los campos tienen el mismo

    public class UserInfo
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
    }

    public class UserInfoDTO
    {
    
            
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
    }

    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>();
    UserInfoDTO userdto = mapper.Map(user);

4.2 Ignorar el mapeo de un campo

    public class UserInfo
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
    }
    public class UserInfoDTO
    {
    
    
        public string id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
    }
    var user = new UserInfo {
    
     
                id = 12, 
                name = "张三", 
                address = "北京"
            };

    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                .IgnoreMembers<UserInfo, UserInfoDTO>(new string[] {
    
     "name" })
            );
    UserInfoDTO userdto = mapper.Map(user);

4.3 Asignar valores predeterminados a elementos vacíos

    public class UserInfo
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
        public DateTime? godate {
    
     get; set; }
    }
    public class UserInfoDTO
    {
    
    
        public string id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
        public DateTime godate {
    
     get; set; }
    }
    var user = new UserInfo {
    
     
                id = 12, 
                name = "张三", 
                address = null,
                godate = null
            };

    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                //如果日期为空设置为当前时间
                .NullSubstitution<DateTime?, DateTime>((value) => DateTime.Now)
                //如果string类型为null赋值为“”
                .NullSubstitution<string, string>((value) => "")
            );
    UserInfoDTO userdto = mapper.Map(user);

4.4 Los nombres de las dos entidades son inconsistentes y necesitan ser mapeados

    public class UserInfo
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
    }
    public class UserInfoDTO
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string userAddress {
    
     get; set; }
    }
    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                .MatchMembers((x, y) =>
                {
    
    
                    if (x == "address" && y == "userAddress")
                    {
    
    
                        return true;
                    }
                    return x == y;
                })
                );
    UserInfoDTO userdto = mapper.Map(user);

4.4 Existe una asociación de clave externa y el nombre de la clave externa debe asignarse

    public class UserInfo
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }

        public Teacher teacher {
    
     get; set; }
    }
    public class Teacher
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
    }
    public class UserInfoDTO
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string teacher {
    
     get; set; }
    }

    var user = new UserInfo {
    
     
                id = 12, 
                name = "张三", 
                address = "北京",
                teacher = new Teacher {
    
     
                    id = 11, 
                    name = "王五" 
                }
            };

     var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                .ConvertUsing<Teacher, string>(t => t.name)
                );
     UserInfoDTO userdto = mapper.Map(user);

4.3 Coexisten múltiples situaciones especiales

public class Sourse
{
    
    
    public int A;
    public decimal? B;
    public string C;
    public Inner D;
    public string E;
}

public class Dest
{
    
    
    public int? A;
    public decimal B;
    public DateTime C;
    public Inner2 D;
    public string F;
}

public class Inner
{
    
    
    public long D1;
    public Guid D2;
}

public class Inner2
{
    
    
    public long D12;
    public Guid D22;
}

ObjectsMapper<Sourse, Dest> mapper1 = 
    new ObjectMapperManager().GetMapper<Sourse, Dest>(
        new DefaultMapConfig()
        .IgnoreMembers<Sourse, Dest>(new string[] {
    
     "A" })
        .NullSubstitution<decimal?, decimal>((value) => -1M)
        .ConvertUsing<Inner, Inner2>(value => new Inner2 {
    
     D12 = value.D1, D22 = value.D2 })
        .PostProcess<Dest>((value, state) => {
    
     value.F = "nothing"; return value; })
        );
Dest dst = mapper1.Map(src);

referencia

5. Comparación simple entre EmitMapper y TinyMapper

Artículo original: Comparación simple entre EmitMapper y TinyMapper

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_43307934/article/details/108717276
Recomendado
Clasificación