Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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 胖型/瘦型控制器与服务层_Asp.net Mvc_Asp.net Mvc 3_Model View Controller_Architecture_Service Layer - Fatal编程技术网

Asp.net mvc 胖型/瘦型控制器与服务层

Asp.net mvc 胖型/瘦型控制器与服务层,asp.net-mvc,asp.net-mvc-3,model-view-controller,architecture,service-layer,Asp.net Mvc,Asp.net Mvc 3,Model View Controller,Architecture,Service Layer,多年来,我一直在使用.Net开发企业应用程序 我的应用程序通常有一个域模型,其中包含映射到SQL DB表的实体。 我使用存储库模式、依赖项注入和服务层 最近,我们开始了MVC3项目的工作,我们有一个争论,应该把哪个逻辑放在哪里。 我采用了瘦控制器/胖模型体系结构,想知道服务层将如何适应 选项1-与服务的模型对话 控制器是精简的,在模型上调用方法。这些模型“知道”如何从数据库中加载自己并与存储库或服务通信。 例如,customerModel有一个Load(id)方法并加载customer和一些子对

多年来,我一直在使用.Net开发企业应用程序 我的应用程序通常有一个域模型,其中包含映射到SQL DB表的实体。 我使用存储库模式、依赖项注入和服务层

最近,我们开始了MVC3项目的工作,我们有一个争论,应该把哪个逻辑放在哪里。 我采用了瘦控制器/胖模型体系结构,想知道服务层将如何适应

选项1-与服务的模型对话 控制器是精简的,在模型上调用方法。这些模型“知道”如何从数据库中加载自己并与存储库或服务通信。 例如,customerModel有一个Load(id)方法并加载customer和一些子对象,如GetContracts()

选项2-控制器与服务对话 控制器要求服务检索模型对象。加载/存储等逻辑在服务层。该模型是一个纯实体模型,仅包含数据

为什么选项1会是一个更好的选择,特别是当我们谈论企业应用程序时,我的经验告诉我要分离关注点,尽可能精简模型和控制器,并让专门的服务来处理业务逻辑(imcl.DB交互)

感谢所有关于优秀资源的建议和参考。

选项1: 您可以认为model==服务。 模型也是业务层

选项2是贫血域模型反模式。

所有这些都取决于应用程序的意图和要求

也就是说,我建议使用“中等规模”(不是本地餐馆,也不是Twitter/Facebook)的web应用程序

  • 精益领域建模

    Dry POCO风格的对象,最好不了解web应用程序的MVC体系结构,以便尽可能与特定实现保持松散耦合。甚至可以将类库重新打包以便在外部应用程序中使用,例如通过WCF web服务的REST API)

    MVC中的“模型”最准确地表示控制器知道的模型,从而表示用于视图的模型

    在较小的(通常是教程)应用程序中,“应用程序/域模型层”的实体模型通常与控制器发送到视图的实例化对象相同

    在大型应用程序中,开发人员通常采用MVVM体系结构的原则,并开始使用单独的视图模型对象。控制器通常调用中间层服务,这些服务与下面看不见的实体一起工作。在这个场景中,MVC中的M最准确地表示视图模型

  • 健壮的服务层

    这并不意味着过度的逻辑,而是编写良好的单用途服务。虽然在模型之外的服务中编码业务逻辑比纯“OOP”更“程序化”,但它在松耦合、测试和灵活部署(例如n层部署)方面有很大帮助

    在我的个人实践中,我在数据层上对服务进行编码,我认为我对POCO对象的行为建模(持久性机制、低级验证等)以及更高级的服务(业务/工作流功能)更接近MVC机制。

  • 精益控制器

    我确保我的控制者仅仅是教练,因为它既不是比赛(发球)也不是球员(实体模型或视图模型),而是决定谁打什么位置和打什么球。我的控制器做两件事:

  • 调用与实体/域模型交互的服务

  • 为适当的视图准备视图模型

  • 即使是经过身份验证/授权的控制器操作也通过注入的服务/属性完成


    编辑1:

    请记住,这并不意味着您的实体/域模型是或必须是贫血的。欢迎使用ORMs、存储库和工厂、验证或状态机制。它只意味着对于中等规模的应用程序,MVC中的模型表示用于控制器的模型,以便将其交给您的视图

    希望这一点能让相信贫血数据模型是反模式的福勒使徒们平静下来。同时,它确实反映了比OOP稍微多一些的过程角度,在OOP中,在建模类中包含行为更纯粹

    没有“终极真理”,但使用这种模式,您会发现构建、测试和部署应用程序很容易,同时保持了大量的可重用性和可伸缩性


    编辑2:

    这就是说,即使是规模适中的应用程序,过度架构(由一个词nerds组成?)系统也太常见了。例如,使用存储库模式包装ORM,然后编写服务来使用存储库。。。所有这些都有助于分离关注点等,但如果您的项目不需要(而且不太可能很快需要)这些东西,请不要构建它。跳过存储库,针对ORM编写精简业务服务(例如查询类),甚至让控制器直接与ORM对话,都没有什么错。这完全取决于规模


    编辑3:


    我想指出的是,这个解释和建议是针对服务器端MVC架构(如ASP.Net)的上下文,而不是针对clent端框架(如Knockout或Backbone)。

    在我们继续讨论将所有内容放在何处之前,您需要更多地了解MVC。好吧,如果你想遵循这个模式。否则你现在可以停止阅读了

    模式的定义非常松散。没有任何内容说明控制器、视图或模型应该是什么样子,或者它们应该如何构造。该模式简单地说明您应该分离各个部分以及它们应该如何相互作用。所以,让我们进一步了解它们是什么(我的解释)

    MVC 型号 模型可以是任何东西。它可以是一个Web服务