Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如何在ASP.NET MVC中为数据库视图建模_Asp.net Mvc 3_Service_Repository Pattern_Factory Pattern - Fatal编程技术网

Asp.net mvc 3 如何在ASP.NET MVC中为数据库视图建模

Asp.net mvc 3 如何在ASP.NET MVC中为数据库视图建模,asp.net-mvc-3,service,repository-pattern,factory-pattern,Asp.net Mvc 3,Service,Repository Pattern,Factory Pattern,我必须逐步用ASP.NET MVC3分层应用程序取代ASP.NET Web表单应用程序。让我们只考虑存储库层 在我新的MVC应用程序中,我有一个项目用于数据(名称MVC.Data),另一个项目用于Web 在MVC.Data中,我有一个edmx文件,其中包含EF类,它只对DB表(无视图)建模,还有一个Respository类myRepository,它提供了执行简单查询的方法 在旧的Web表单应用程序中,我有一个GridView,它是使用asDataSourceSQL数据库视图填充的 为了在新的M

我必须逐步用ASP.NET MVC3分层应用程序取代ASP.NET Web表单应用程序。让我们只考虑存储库

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

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

在旧的Web表单应用程序中,我有一个
GridView
,它是使用as
DataSource
SQL数据库视图填充的

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

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

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


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

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

public ActionResult Index()
{
    SomeDomainModel model = repository.GetSomeDomainModel();
    SomeViewModel vm = Mapper.Map<SomeDomainModel, SomeViewModel>(model);
    return View(vm);
}
public ActionResult Index()
{
SomeDomainModel=repository.GetSomeDomainModel();
SomeViewModel vm=Mapper.Map(model);
返回视图(vm);
}
视图模型是在MVC项目中定义的,因为它是专门为满足给定视图的要求而设计的类

我在回答中显示的
Mapper.Map
方法来自我在项目中使用的方法,但是您可以定义任何您喜欢的自定义映射层

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


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

谢谢。实际上,我的意思不是ViewModel本身,而是前面的步骤。我有一个表产品,其ProductId字段和其他字段作为其他表的外键。我必须创建一个Product类,其中所有外键都被我看到的表的字段名替换。我被您在服务层中使用的名称
myViewClass
弄糊涂了。在这种情况下,将传输实体(因为它们不再是域实体)聚合为真正的域对象的服务层可能是一种选择。我这样问是因为我观看了MVC店面视频,它直接在存储库中使用由域模型获取的信息组成的类。我猜它只是绕过了服务层