Это обычная вещь, которую мне нужно делать в последнее время, и я искал любые общие шаблоны, чтобы сделать это немного легче.
Основной смысл всего этого в том, что у меня есть некоторые модели данных, которые смоделированы для удовлетворения ORM и просто выполняют операции CRUD для объектов. Эти модели в настоящее время открыты через репозитории/фабрики (в зависимости от того, являются ли их C или RUD).
Затем у меня есть модель представления, которая немного читаема и посыпана проблемами пользовательского интерфейса, такими как данные проверки и сопоставления между представлением (это сценарий ASP.MVC, но эта ситуация может быть абстрагирована в большинстве ситуаций).
Итак, скажем, я перехожу к localhost/user/1, который должен пойти и получить мне пользователя с Id 1 в БД, а затем отобразить его в пользовательском интерфейсе. В конечном итоге это должно вывести данные из области данных, а затем отобразить их в модели ui для показа.
Вот пример сценария:
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);
}
}
Это простой пример, но показывает, как модель данных содержит много одинаковой информации, но в этом вопросе вы не заботитесь обо всей информации, просто ее подмножестве. Таким образом, имея сопоставитель, вы можете абстрагировать не только отображение, но и связь с доменом данных, однако вам нужно написать класс сопоставления для каждого типа, и вышеупомянутое предполагает, что это одностороннее сопоставление, а не одностороннее отображение, которое потребуется еще немного кода.
Итак, как вы все собираетесь выполнять это сопоставление? Поскольку в настоящее время я только что писал матчи абстракции, которые в основном позволяют слою пользовательского интерфейса запускать запрос и возвращать модель представления, абстрагировать репозитории и копировать данные из одной модели в другую, и она просто чувствует, что должно быть лучше способ сделать это.