这是我最近需要做的一件常见的事情,我正在寻找任何常见的模式来使这变得更容易一些。
这一切的主要要点是我有一些数据模型,它们被建模来满足 ORM 并纯粹对对象进行 CRUD 操作。这些模型目前通过存储库/工厂公开(取决于其 C 还是 RUD)。
然后,我有一个视图模型,它更具可读性,并且充满了 UI 问题,例如视图之间的验证和映射数据(这是一个 ASP.MVC 场景,但这种情况可以抽象为大多数情况)。
假设我转到 localhost/user/1,应该会在数据库中获取 ID 为 1 的用户,然后将其显示在 UI 上。最终,这必须从数据域中提取数据,然后将其映射到 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);
}
}
这是一个简单的示例,但显示了数据模型如何包含大量相同类型的信息,但在这个有问题的视图中,您不关心所有信息,而只关心其中的一个子集。这样,有了映射器,您不仅可以抽象映射,还可以抽象与数据域的通信,但是您需要为每种类型编写一个映射器类,并且上面假设它是单向映射,而不是双向映射需要更多代码。
那么你们是如何进行这个映射的呢?目前我刚刚编写抽象映射器,它基本上允许 UI 层运行查询,并返回视图模型,抽象存储库并将数据从一个模型复制到另一个模型,感觉应该有一个更好的方法来做到这一点。
在 .net 中,你可能应该看看 Automapper
https://github.com/AutoMapper/AutoMapper https://github.com/AutoMapper/AutoMapper
它本质上允许您执行以下操作:
CreateMap<Domain.Customer, ViewModel.Customer>()
然后您可以通过以下方式在两者之间进行映射:
var vmCustomer = Mapper.Map<Domain.Customer, ViewModel.Customer>(domainCustomer);
它可能会为您节省大量样板代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)