C# mvc模式中模型与控制器的分离

C# mvc模式中模型与控制器的分离,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,声明实体框架命令或数据集(ado.net)以访问或操作mvc模式中的数据应该在模型中,正如我所知,当我想在数据库中获取我的对象列表时,所有方法都应该在模型和返回列表中,控制器只需获取该命令或数据集并将其传递给视图 但正如我在许多代码中所看到的,控制器中使用了脱色方法,如 这部分代码应该在模型或控制器中?在控制器操作中,这部分代码没有问题。MVC中的模型负责围绕数据的业务逻辑,但实际检索该数据实际上是控制器的工作。因为where子句和只选择特定列之类的事情是特定于每个视图的需要的,所以将其隐藏在模

声明实体框架命令或数据集(ado.net)以访问或操作mvc模式中的数据应该在模型中,正如我所知,当我想在数据库中获取我的对象列表时,所有方法都应该在模型和返回列表中,控制器只需获取该命令或数据集并将其传递给视图

但正如我在许多代码中所看到的,控制器中使用了脱色方法,如


这部分代码应该在模型或控制器中?

在控制器操作中,这部分代码没有问题。MVC中的模型负责围绕数据的业务逻辑,但实际检索该数据实际上是控制器的工作。因为where子句和只选择特定列之类的事情是特定于每个视图的需要的,所以将其隐藏在模型中甚至没有意义。理想情况下,模型应该能够服务于任何视图(尽管应该在模型周围使用视图模型之类的东西来封装正在使用的特定视图的需求)。

在控制器操作中,这一数量的代码很好。MVC中的模型负责围绕数据的业务逻辑,但实际检索该数据实际上是控制器的工作。因为where子句和只选择特定列之类的事情是特定于每个视图的需要的,所以将其隐藏在模型中甚至没有意义。理想情况下,模型应该能够服务于任何视图(尽管应该在模型周围使用视图模型之类的东西来封装正在使用的特定视图的需求)。

理想情况下,此代码属于业务层。我通常在我的数据层(使用EF)和控制器之间创建一个服务层。服务(
UserService
例如)将域模型返回给控制器。然后,控制器将其映射到ViewModel并返回视图。通过这种方式,您可以将数据访问从控制器中抽象出来,这样您就不会到处都有(相同的)LINQ查询

在您的情况下,控制器将如下所示:

Buddyship buddies = _buddyService.GetBuddiesByUserId(user.UserId);
BuddyViewModel buddyViewModel = new BuddyViewModel(buddies);
return View(buddyViewModel);

对于非常小的项目,此代码在控制器中很好,但在域模型类中肯定不行。

理想情况下,此代码属于业务层。我通常在我的数据层(使用EF)和控制器之间创建一个服务层。服务(
UserService
例如)将域模型返回给控制器。然后,控制器将其映射到ViewModel并返回视图。通过这种方式,您可以将数据访问从控制器中抽象出来,这样您就不会到处都有(相同的)LINQ查询

在您的情况下,控制器将如下所示:

Buddyship buddies = _buddyService.GetBuddiesByUserId(user.UserId);
BuddyViewModel buddyViewModel = new BuddyViewModel(buddies);
return View(buddyViewModel);

对于非常小的项目,这段代码在控制器中很好,但在域模型类中肯定不行。

在控制器中很好。如果需要重用该代码,请将其移动到服务类。

在控制器中即可。如果需要重用代码,则将其移动到服务类。

拥有一个不控制任何东西的控制器有什么意义?一个动作方法除了调用其他方法,并将其他方法的结果传递给一个视图之外,什么也不做。对我来说,它就像一块空间和时间的腰围。如果一个方法需要调用多次,并在控制器中声明它,那么在每个控制器中我应该声明它!当然,控制器显然可以调用其他方法,而不是出于代码重用的其他原因。但是,除了将结果传递给视图之外,一个方法完全执行一个特定操作方法应该执行的操作,这将是不可重用的(除非有两个操作方法执行完全相同的操作,这将是非常糟糕的)。拥有一个不控制任何内容的控制器有什么意义?一个动作方法除了调用其他方法,并将其他方法的结果传递给一个视图之外,什么也不做。对我来说,它就像一块空间和时间的腰围。如果一个方法需要调用多次,并在控制器中声明它,那么在每个控制器中我应该声明它!当然,控制器显然可以调用其他方法,而不是出于代码重用的其他原因。但是,除了将结果传递给视图之外,一个方法完全执行一个特定操作方法应该执行的操作,它将不可重用(除非您有两个操作方法执行完全相同的操作-这将非常糟糕)。因此,您能举一些例子说明哪些数据应该在模型中定义吗?@Moslem7026模型,如在模型视图控制器中,它本身是应用程序中的一个层,通常被划分为子层,如我所建议的,如数据访问、业务逻辑(服务)以及域实体。我们通常也将这些领域实体称为“模型”。这些实体被映射到数据库中的表。那么,你能举一些例子说明哪些数据应该在模型中定义吗?@Moslem7026模型,就像在模型视图控制器中一样,它本身是应用程序中的一个层,并且通常分为子层,如我所建议的,比如数据访问、业务逻辑(服务)以及域实体。我们通常也将这些领域实体称为“模型”。这些实体映射到数据库中的表。