1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wuyuege-RobotMapper

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

RobotMapper

Релизы

NuGet

Адрес проекта: https://gitee.com/wuyuege/RobotMapper


История создания RobotMapper

  1. В повседневной разработке проектов необходимо преобразовывать данные из слоя доступа к данным (Entity) в слой передачи данных (DTO), или преобразовывать данные из слоя передачи данных (DTO) в модель представления для интерфейса (ViewModel). Ручное написание методов преобразования утомительно, и по мере увеличения структуры и количества классов объём кода становится большим и неудобным для обновления и обслуживания. Поэтому необходим инструмент автоматического сопоставления, который поможет нам выполнить эту работу.

  2. У нас есть следующие требования к инструменту сопоставления:

    • Высокая эффективность преобразования: очевидно, что запрос данных занимает всего 0,001 миллисекунды, но преобразование занимает одну секунду, что неприемлемо;
    • Простота конфигурации или отсутствие необходимости в настройке: каждый раз, когда выполняется сопоставление, требуется сложная конфигурация, которая ничем не отличается от ручного сопоставления и вызывает раздражение;
    • Решение проблемы циклических ссылок: особенно в слое доступа к данным, из-за отношений между таблицами базы данных наши объекты Entity будут иметь множество одно-к-одному, один-ко-многим и многие-ко-многим навигационных свойств, а взаимные ссылки между типами неизбежны. Традиционные инструменты сопоставления не могут автоматически решить эту проблему, либо вызывая бесконечный цикл, либо снижая эффективность сопоставления.

Таким образом, этот инструмент сопоставления «RobotMapper» был создан для решения этих проблем. Он называется RobotMapper, и всё делается автоматически!


Использование RobotMapper

Давайте сначала создадим соответствующие DTO и Entity.

Entity

namespace Entity
{
    public class User
    {
        public User()
        {
            Roles = new List<Role>();
        }
        public string Id { get; set; }
        public string Name { get; set; }
        public string Code { get; set; }
        public string Department { get; set; }
        public List<Role> Roles { get; set; }
        public User User12 { get; set; }
    }
}

namespace Entity
{
    public class Role
    {
        public string Name { get; set; }

        public List<User> Users { get; set; }
    }
}

DTO

namespace DTO
{
    public class User
    {
        public User()
        {
            Roles = new List<Role>();
        }
        public string Id { get; set; }
        public string Name { get; set; }
        public string Code { get; set; }
        public string Department { get; set; }
        public List<Role> Roles { get; set; }
        public User User12 { get; set. }
        public string UserName { get; set; }
    }
}

namespace DTO
{
    public class Role
    {
        public string Name { get; set; }

        public List<User> Users { get; set; }
    }
}

Далее создаём пользователя

public static User 创建扁平化User()
{
    Entity.User user = new User()
    {
        Code = "Liuhai",
        Id = "hai.liu",
        Department = "部门1",
        Name = "海哥",
    };
    return user;
}
  1. Без настройки:
var user = TestHelper.创建扁平化User();
var newuser = user.RobotMap<User, DTO.User>();
Assert.AreEqual(user.Code, newuser.Code);
Assert.AreEqual(user.Id, newuser.Id);
Assert.AreEqual(user.Department, newuser.Department);
Assert.AreEqual(user.Name, newuser.Name);

  1. Решение циклических ссылок
    Создаём пользователя с циклической ссылкой
public static User 创建循环引用User()
{
    Entity.User user = new User()
    {
        Code = "Liuhai",
        Id = "hai.liu",
        Department = "部门1",
        Name = "海哥",
    };
    user.Roles.Add(new Role()
    {
        Name = "角色1",
        Users = new List<User>() { new User() { Name = "SB" } }
    });

    return user;
}

По-прежнему автоматическое сопоставление

var user = TestHelper.创建循环引用User();
var newuser = user.RobotMap<User, DTO.User>();
Assert.AreEqual(user.Code, newuser.Code);
Assert.AreEqual(user.Id, newuser.Id);
Assert.AreEqual(user.Department, newuser.Department);
Assert.AreEqual(user.Name, newuser.Name);
Assert.IsTrue(newuser.Roles.Count == 1);

  1. Эффективность
var user = TestHelper.创建循环引用User();
for (int i = 1; i <= 100000; i++)
{
    var newuser = user.RobotMap<User, DTO.User>();
}

Вы можете протестировать этот код самостоятельно. Сопоставление десяти тысяч раз: требуется всего одна секунда.


  1. Массовое сопоставление
List<User> users = new List<User>();
for (int i = 1; i <= 10000; i++)
{
    var user = TestHelper.创建循环引用User();
    users.Add(user);
}
var newusers = users.RobotMap<User, DTO.User>();

Этот код также можно протестировать самостоятельно. Массовое сопоставление одной тысячи элементов: требуется всего 190 миллисекунд.


Другие функции:

  • Поддержка пользовательских конфигураций сопоставления:
[TestMethod]
public void 测试配置Bind()
{
    Mapper.Initialize(creator =>
    {
        creator.CreatMap<User, DTO.User>(config =>
        {
            config.Bind(x => x.User12.Name, y => y.UserName);
            config.BindName(x => x.User12, y => y.User13);
            config.Ignore(y => y.Roles);
        });
    });
}

  • Поддержка игнорирования свойств:
[TestMethod]
public void 测试忽略规则转换()
{
    Mapper.Initialize(creator =>
    {
        creator.CreatMap<User,
``` **Текст запроса:**

DTO.User>(config =>  
    {  
        config.Ignore(y => y.Code);  
        config.Ignore("Department", "Name");  
    });  
});  
var user = TestHelper.创建扁平化User();  
var newuser = user.RobotMap<User, DTO.User>();  
Assert.IsNull(newuser.Code);  
Assert.IsNull(newuser.Department);  
Assert.IsNull(newuser.Name);  
}

---  
- 支持即用即配  

[TestMethod]  
public void 测试即用即配绑定()  
{  
    var user = TestHelper.创建自引用User();  
    var newuser = user.RobotMap<User, DTO.User>(config=>  
    {  
        config.Bind(x => x.User12.Name, y => y.UserName);  
        config.BindName(x => x.User12, y => y.User13);  
    });  
    Assert.AreEqual(user.User12.Name, newuser.UserName);  
}  

[TestMethod]  
public void 测试即用即配忽略()  
{  
    var user = TestHelper.创建扁平化User();  
    var newuser = user.RobotMap<User, DTO.User>(config=>  
    {  
        config.Ignore(y => y.Code);  
        config.Ignore("Department", "Name");  
    });  
    Assert.IsNull(newuser.Code);  
    Assert.IsNull(newuser.Department);  
    Assert.IsNull(newuser.Name);  
}  

---  
- 子类映射启用父类策略  

在类与类之间进行映射时,当没有配置两者之间的映射关系时,可自动启用父类映射绑定规则:  
==优先级为:源子类-目标子类>>源父类->>目标子类->>->>目标父类->>源父类->>目标父类==  
使用详情可查看: [子类映射启用父类策略](https://gitee.com/wuyuege/RobotMapper/wikis/%E5%AD%90%E7%B1%BB%E6%98%A0%E5%B0%84%E5%90%AF%E7%94%A8%E7%88%B6%E7%B1%BB%E7%AD%96%E7%95%A5)  

###### 注:即用即配的策略仅在本次映射中生效,与全局配置互不影响!  

**Перевод текста запроса на русский язык:**

DTO.User>(конфиг =>  
    {  
        конфиг.Игнор(у => у.Код);  
        конфиг.Игнор("Отдел", "Имя");  
    });  
});  
вар пользователь = TestHelper.СоздатьСглаженныйПользователь();  
вар новыйпользователь = пользователь.РоботМап<Пользователь, DTO.Пользователь>();  
Утвердить.Равно(новыйпользователь.Код, ноль);  
Утвердить.Равно(новыйпользователь.Отдел, ноль);  
Утвердить.Равно(новыйпользователь.Имя, ноль);  
}

---  
- Поддержка «используй и подключай»  

[МетодТеста]  
общественное недействительное тестированиеИспользованиеИПодключениеСвязывания()  
{  
    вар пользователь = TestHelper.СоздатьСамоссылающийсяПользователь();  
    вар новыйпользователь = пользователь.РоботМап<Пользователь, DTO.Пользователь>(конфиг=>  
    {  
        конфиг.Привязка(х => х.Пользователь12.Имя, у => у.ИмяПользователя);  
        конфиг.ПривязатьИмя(х => х.Пользователь12, у => у.Пользователь13);  
    });  
    Утвердить.Равно(пользователь.Пользователь12.Имя, новыйпользователь.ИмяПользователя);  
}  

[ТестМетод]  
публичное недействительное тестированиеИгнорированиеИспользованияИПодключения()  
{  
    вар пользователь = TestHelper.СоздатьСглаженныйПользователь();  
    вар новыйпользователь = пользователь.РоботМап<Пользователь, DTO.Пользователь>(конфиг=>  
    {  
        конфиг.Игнорировать(у => у.Код);  
        конфиг.Игнорировать("Отдел", "Имя");  
    });  
    Утвердить.Равно(ноль, новыйпользователь.Код);  
    Утвердить.Равно(ноль, новыйпользователь.Отдел);  
    Утвердить.Равно(ноль, новыйпользователь.Имя);  
}  

---  
- Стратегия наследования классов  

При сопоставлении между классами, когда нет конфигурации для сопоставления между ними, можно автоматически активировать стратегию привязки наследования родительских классов:  
==Приоритет: исходный дочерний класс  целевой дочерний класс >> исходный родительский класс ->> целевой дочерний класс ->> источник ->> целевой родительский класс ->> исходный родительский класс ->> целевой родительский класс==  
Для получения дополнительной информации см.: [Стратегия активации наследования родительского класса](https://gitee.com/wuyuege/RobotMapper/wikis/pages?title=Стратегия%20активации%20наследования%20родительского%20класса&parent=)  

*Примечание:* стратегия «используй и подключай» действует только в этом отображении и не влияет на глобальную конфигурацию!  

### Подробные документы:  

- [Автоматическая конфигурация стратегии](https://gitee.com/wuyuege/RobotMapper/wikis/pages?title=Автоматическая%20конфигурация%20стратегии&parent=)  
- [Интеллектуальное решение проблемы циклических ссылок](https://gitee.com/wuyuege/RobotMapper/wikis/pages?title=Интеллектуальное%20решение%20проблемы%20циклических%20ссылок&parent=)  
- [Эффективность и скорость](https://gitee.com/wuyuege/RobotMapper/wikis/pages?title=Эффективность%20и%20скорость&parent=)  
- [Пользовательская привязка и игнорирование](https://gitee.com/wuyuege/RobotMapper/wikis/pages?title=Пользовательская%20привязка%20и%20игнорирование&parent=)  
- [«Используй и подключай»](https://gitee.com/wuyuege/RobotMapper/wikis/pages?title=%C2%ABИспользуй%20и%20подключай%C2%BB&parent=)  
- [Типы, поддерживаемые RobotMapper](https://gitee.com/wuyuege/RobotMapper/wikis/pages?title=Типы,%20поддерживаемые%20RobotMapper&parent=)  
- [Типы, которые RobotMapper в настоящее время не поддерживает](https://gitee.com/wuyuege/RobotMapper/wikis/pages?title=Типы,%20которые%20RobotMapper%20в%20настоящее%20время%20не%20поддерживает&parent=)  

Другие функции: в разработке.  

## В заключение надеюсь, что вы сможете найти ошибки, а также дать мне некоторые предложения и рекомендации!

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/wuyuege-RobotMapper.git
git@api.gitlife.ru:oschina-mirror/wuyuege-RobotMapper.git
oschina-mirror
wuyuege-RobotMapper
wuyuege-RobotMapper
master