Адрес проекта: https://gitee.com/wuyuege/RobotMapper
В повседневной разработке проектов необходимо преобразовывать данные из слоя доступа к данным (Entity) в слой передачи данных (DTO), или преобразовывать данные из слоя передачи данных (DTO) в модель представления для интерфейса (ViewModel). Ручное написание методов преобразования утомительно, и по мере увеличения структуры и количества классов объём кода становится большим и неудобным для обновления и обслуживания. Поэтому необходим инструмент автоматического сопоставления, который поможет нам выполнить эту работу.
У нас есть следующие требования к инструменту сопоставления:
Давайте сначала создадим соответствующие 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;
}
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);
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);
var user = TestHelper.创建循环引用User();
for (int i = 1; i <= 100000; i++)
{
var newuser = user.RobotMap<User, DTO.User>();
}
Вы можете протестировать этот код самостоятельно. Сопоставление десяти тысяч раз: требуется всего одна секунда.
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 )