【问题标题】:How to model a Database View in ASP.NET MVC如何在 ASP.NET MVC 中为数据库视图建模
【发布时间】:2012-03-13 16:34:49
【问题描述】:

我必须逐渐用 ASP.NET MVC3 分层 应用程序替换 ASP.NET Web 窗体 应用程序。让我们只考虑 Repository 层。

在我的新 MVC 应用程序中,我有一个用于 Data(名称 MVC.Data)的项目和一个用于 Web 的项目。

MVC.Data 中,我有一个 edmx 文件,其中包含 EF 类,它仅对 DB 表(无视图)进行建模,还有一个 Respository 类 myRepository,它提供了执行简单查询的方法.

在旧的 Web 窗体应用程序中,我有一个 GridView,它使用 DataSource 填充一个 SQL 数据库 视图。

为了在我的新 MVC3 应用程序中获得相同的结果,我有两个选择:

1) 创建一个服务层(和项目MVC.Services),其中我有一个填充新类myViewClass 的方法,该类包含SQL DB 视图的所有字段并给它到控制器。

2) 在MVC.Data 项目中创建一个类,该类由其构造函数通过直接针对 EF 类使用 LINQ 语句直接填充。

我了解了工厂模式,第一种解决方案似乎是最合适的,但是很多人总是建议不要创建不需要的服务层。在这种情况下,最好的选择是什么?

【问题讨论】:

    标签: asp.net-mvc-3 service repository-pattern factory-pattern


    【解决方案1】:

    实际上构建视图模型应该在映射层中完成。基本上,您的控制器操作可能如下所示:

    public ActionResult Index()
    {
        SomeDomainModel model = repository.GetSomeDomainModel();
        SomeViewModel vm = Mapper.Map<SomeDomainModel, SomeViewModel>(model);
        return View(vm);
    }
    

    视图模型是在 MVC 项目中定义的,因为它是一个专门设计用于满足给定视图要求的类。

    我在回答中显示的Mapper.Map&lt;TSource, TDest&gt; 方法来自我在项目中使用的AutoMapper,但您可以定义任何您喜欢的自定义映射层。

    映射层也必须是 MVC 项目的一部分,因为它必须知道您的域模型和视图模型才能执行映射。

    就服务层而言,当您有一些复杂的业务操作可能由多个简单的存储库调用组成时,您可以使用一个。但有些人可能会争论服务层的存在。我认为这两种方法各有优缺点,在设计系统时必须对其进行评估,最重要的是要考虑到您正在设计的特定上下文和场景。

    【讨论】:

    • 谢谢。实际上我的意思不是 ViewModel 本身,而是前面的步骤。我有一个带有 ProductId 字段的表 Product 和其他字段作为其他表的外键。我必须创建一个 Product 类,其中所有外键都替换为该表的字段名称
    • 我明白了。我对您在服务层中使用的名称myViewClass 感到困惑。那么在这种情况下,将您的传输实体(因为它们不再是域实体)聚合到真正的域对象中的服务层可能是要走的路。
    • 我问这个是因为我观看了 MVC Storefront 视频,它直接在存储库中使用由域模型获取的信息组成的类。我猜它只是绕过了服务层
    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2012-06-11
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2013-09-21
    相关资源
    最近更新 更多