Это обычная вещь, которую мне нужно было делать в последнее время, и я искал какие-либо общие шаблоны, чтобы сделать это немного легче.
Основная суть всего этого в том, что у меня есть несколько моделей данных, которые смоделированы для удовлетворения ORM и просто выполняют CRUD-операции с объектами. Эти модели в настоящее время выставляются через репозитории / фабрики (зависит от того, является ли их C или RUD).
Затем у меня есть модель представления, которая немного более читабельна и покрыта проблемами пользовательского интерфейса, такими как проверка и отображение данных между представлениями (это сценарий ASP.MVC, но эту ситуацию можно абстрагировать в большинстве ситуаций). ).
Итак, допустим, я захожу в localhost / user / 1, который должен зайти и получить мне пользователя с Id 1 в БД, а затем отобразить его в пользовательском интерфейсе. В конечном итоге для этого необходимо извлечь данные из предметной области, а затем отобразить их в модели пользовательского интерфейса для отображения.
Вот пример сценария:
public class OrmUser
{
public int Id {get;set;}
public string Name {get;set;}
public IList<Permission> Permissions {get;set;}
}
public class UiUser
{
[Required]
public int Id {get;set;}
[Required]
public string Name {get;set;}
public bool IsUserAdmin {get;set;}
}
public class UserMapper : IMapper<UiUser>
{
public UiUser Get(int id)
{
var ormUser = UserRepository.Get(id);
var uiUser = new UiUser
{
Id = ormUser.Id,
Name = ormUser.Name,
IsUserAdmin = IsUserAdmin(ormUser.Permissions)
}
}
private bool IsUserAdmin(IList<Permission> permissions)
{
return permissions.SomeLinq(ToFindIfTheyAreAnAdmin);
}
}
Это простой пример, но он показывает, что модель данных содержит много информации того же рода, но в данном случае вам не нужна вся информация, а только ее подмножество. Таким образом, имея mapper, вы можете абстрагировать не только отображение, но и связь с предметной областью, однако вам нужно написать класс mapper для каждого типа, и в приведенном выше примере предполагается, что это одностороннее, а не двухстороннее отображение, которое потребуется еще немного кода.
Так как же вы все выполняете это картирование? Как и сейчас, я только что писал средства отображения абстракций, которые в основном позволяют слою пользовательского интерфейса выполнять запрос и возвращать модель представления, абстрагируя репозитории и копируя данные из одной модели в другую, и мне кажется, что должно быть лучше способ сделать это.