【发布时间】:2015-07-10 11:15:37
【问题描述】:
我在网上看到很多代码参考,他们直接在Controller中使用服务。
public class PersonController : Controller
{
public ActionResult Index(int personId)
{
Person personDataModel = null;
using(var service = new Personservice())
{
personDataModel = service.GetPerson(personId);
}
var personVM = MapPersonDataModelToViewModel(personDataModel);
return View("Index",personVM);
}
}
根据MSDN,控制器是处理用户交互的组件,与模型一起工作,并最终选择一个视图来呈现显示 UI。
哪里提到了服务? 我知道人们在谈论服务层模式或 SOA 架构。但这仍然是一个违规。 为了方便而违反?
出于某种原因,如果我想取消服务。然后我将最终更改控制器。并且必须建立我的模型。 我想只更改模型。
我觉得 Model 应该具备智能,可以通过调用外部服务或自行处理来自 Controller 的请求。
public class PersonController : Controller
{
public ActionResult Index(int personId)
{
var personVM = PersonModel.GetPerson(personId);
return View("Index",personVM);
}
}
public class PersonModel
{
public PersonVM GetPerson(int personId)
{
Person personDataModel = null;
//Can either do this
using(var service = new Personservice())
{
personDataModel = service.GetPerson(personId);
}
//Or can do this
personDataModel = GetPersonDataModel(personId);
var personVM = MapPersonDataModelToViewModel(personDataModel);
return personVM;
}
}
我知道 PersonModel 需要重构,但这不是重点。
更新:
当我指的是模型时,我指的不是我们传递给视图的模型(具有属性的类)。我的意思是文件夹模型中的类。
根据MSDN,模型:模型对象是应用程序中实现应用程序数据域逻辑的部分。通常,模型对象检索模型状态并将其存储在数据库中。
我从上面假设文件夹 Model 中的类对象应该具有执行 CRUD 操作的逻辑。
我是不是错过了什么。请分享您的宝贵想法。
【问题讨论】:
-
这取决于许多活动部件。如果您遵循 DDD,您将拥有不同类型的服务,如果您在控制器中使用它们中的一些是可以的,而其他一些则更有意义从对象持久层或视图模型中调用它们,就像您的情况一样。除此之外,这也取决于您的系统范围,我不敢为了遵循规则而为简单的应用程序构建服务和添加层。最后,这是个人品味的问题......只是一个想法。
-
我说的是专门针对 CRUD 操作的服务。
-
首先,您的文章有点过时(MVC4.)。话虽如此,MVC 更像是使用 MV 的 M-MV-V-C。看看这个页面:en.m.wikipedia.org/wiki/Model_View_ViewModel
标签: c# asp.net-mvc design-patterns model-view-controller n-tier-architecture