【发布时间】:2012-01-08 01:30:53
【问题描述】:
这是我最近需要做的一件常见的事情,我正在寻找任何常见的模式来让这更容易一些。
这一切的主要要点是我有一些数据模型,它们被建模以满足 ORM 并纯粹对对象进行 CRUD 操作。这些模型目前通过存储库/工厂公开(取决于它的 C 或 RUD)。
然后我有一个视图模型,它更具可读性,并且散布着 UI 问题,例如视图之间的验证和映射数据(这是一个 ASP.MVC 场景,但这种情况可以抽象为大多数情况)。
假设我转到 localhost/user/1,应该会在 DB 中获取 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);
}
}
这是一个简单的示例,但显示了数据模型如何包含许多相同类型的信息,但在这个有问题的视图中,您并不关心所有信息,只是其中的一个子集。通过这种方式,拥有一个映射器,您不仅可以抽象映射,还可以抽象与数据域的通信,但是您需要为每种类型编写一个映射器类,上面假设它是单向映射,而不是 2 向映射需要更多代码。
那么你们是如何进行这种映射的呢?目前我刚刚在编写抽象映射器,它基本上允许 UI 层运行查询,并取回视图模型,抽象存储库并将数据从一个模型复制到另一个模型,感觉应该有一个更好的方法来做到这一点。
【问题讨论】:
-
对我来说,guestion 很抽象,你到底想映射什么?
-
嗯,它不是一个特定的模型,它意味着有点抽象。我敢肯定,如今大多数 Web 应用程序都有多个层/域,其中包含相似的模型来表示相同类型的数据。我只是在寻找一种很好的模式来管理层之间的映射和通信。将在我最初的问题中添加一些虚拟模型,以帮助了解我所追求的目标,尽管到目前为止 Paul 已经给出了一个很好的答案。
-
另外值得注意的是,虽然这是一个 .net 示例,但实际上任何语言都可能发生相同的情况。因此,任何与语言无关的模式都是理想的,尽管为给定平台简化这项任务的框架也很好......
-
考虑到 Automapper 将是一个不错的选择
-
@Arnis L. 与仅处理您的数据源(即 Nhibernate、MongoDb 等)有关的类和模型的逻辑分组。因为您不会使用相同的模型将实体持久保存在 Nhibernate 中会将它们显示到用户界面,因此数据/用户界面域的区别。
标签: design-patterns viewmodel models