如何克服Model→ViewModel阻抗不匹配?

时间:2009-11-19 13:51:18

标签: c# asp.net-mvc

我很困惑。

我有我的linq-to-sql模型,它是数据库表的镜像

(Id, CustomerId, RegionId,...N), 
没有什么有趣的,所有的外键。现在我需要在我的asp.net视图中查看这些数据。我创建了一个ViewModel

(Id, CustomerId, Customer, RegionId, Region, CustomersSelectList, RegionsSelectList). 

显然,viewmodel是linq-to-sql模型的超集。

现在我如何将一个变换为另一个?我正在使用自动播放器,但对于如何找到获取缺失数据的良好模式感到困惑。

我看到了可能的解决方案:

  1. 创建第3类,它将是l2s模型+连接值,并通过连接和投影填充此类。然后将此类自动化为我的viewmodel。

  2. 通过投影返回匿名类,并通过automapper将它们映射到viewmodels(不是很干净)。

  3. 创建用于查询的数据库视图(视图是连接在一起的所有必需表)。

  4. 请帮助我,因为早些时候我一直在视图中使用我的L2S类(在简单的项目中),现在我有更复杂的视图,需要做一些事情来解决复杂性。

    另外,谁的责任是进行这种转变?应该在哪里发生?

    谢谢。

    更新: 让我澄清一下。我需要能够完全展示我的业务实体。 在db中它存储在多个表中,在L2S中它是许多类(镜像db表),在我的ViewModel中它应该从许多db表中“累积”。

    我应该通过linq执行sql连接并直接填充ViewModel吗?

    我应该创建一个包含所有字段的业务实体(不是linq),并用linq填充到sql,然后将其自动化到ViewModel?

    我是否应该停止使用L2S类作为业务实体,从头开始创建一个新的业务实体类,并将L2S视为一个愚蠢的ORM?

1 个答案:

答案 0 :(得分:1)

我对automapper不太熟悉,知道这实际上是否有用,但我认为你可以分两步完成。首先,让automapper映射彼此镜像的所有属性。接下来,要么在其他属性中包含可以获取正确值的逻辑,要么从启动映射的对象中设置逻辑。