最近我需要做的一件常见事情是寻找任何常见模式,使其更容易一些。主要思路是我有一些数据模型,它们被建模以满足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层运行查询并获取一个视图模型,抽象出了存储库和从一个模型复制数据到另一个模型的过程,但感觉应该有更好的方法来完成这个任务。