【问题标题】:ASP.NET MVC: Service layer, Data layer and Controllers - how do they talk together?ASP.NET MVC:服务层、数据层和控制器——它们是如何联系在一起的?
【发布时间】:2011-03-24 22:50:01
【问题描述】:

好的,我正在尝试重写这个设计不佳的 ASP.NET MVC 应用程序中的大部分代码。我已经阅读了很多关于许多概念和模式的内容,其中一些更高级,但我发现自己对非常基本的人员感到困惑。

那么 MVC 应用的整体结构应该是怎样的呢?

我有一些封装数据访问的东西——我们称之为“数据层”。它可能是存储库模式的实现,或者只是一些实体框架上下文类或......

然后我将服务层包装业务逻辑。

服务 http 请求的场景应该是什么? 为请求创建控制器 --> 对其执行操作。然后 ?我创建“数据层”的实例并将其传递给方法服务层提交更改并显示结果?

所以所有服务(属于服务层)中的每个方法都应该将一些“数据层”类作为参数,以便它可以与“数据层”对话?或者我是否将“数据层”引用传递给构造函数中的服务?在那种情况下,我必须为每个请求创建新服务吗?

我读过关于在控制器中使用using 关键字将“数据层”引用传递给服务。另一种方法是使用依赖注入。我真的不明白其中的区别......为什么不在控制器构造函数中创建它并保持简单?

【问题讨论】:

  • 我认为您对 using 关键字感到困惑,因为它所做的只是确保调用 Dispose,并且使用 DI 可以帮助您对控制器进行单元测试,因为您可以传入一个模拟语境。 DI还有其他优势,比如去耦等。
  • 嗯,依赖注入将允许您将“数据层”传递给构造函数,而不是到处都有一堆new ...。这使您可以将“数据层”的创建方式与其使用位置分离(正如 Linkgoron 所指出的,这有助于单元测试)。
  • 谢谢你们,我想我明白这部分了。
  • 这里也有一些很好的基础知识:stackoverflow.com/questions/2503442/…

标签: .net asp.net-mvc design-patterns controller repository-pattern


【解决方案1】:

问题的实际答案

@drasto 无意冒犯,但您似乎不是重构设计不佳的现有应用程序的人,因为您自己正在为相当基本的事情苦苦挣扎。至少您不应该在要部署的应用程序上执行此操作。

帮助

最好与完成 EF/Asp.net MVC/repository/service 模式并知道它们如何相互通信以及应该如何实现它们的开发分析师交谈。好处是您可以通过这种方式学到很多东西,并以正确的方式学习它。你为什么要重新发明整个轮子。

您还可以从 http://www.asp.net/mvc 上提供的示例中学习,这些示例将向您展示应该如何使用良好的应用程序架构逐步完成工作。

我只想告诉你,在一些老板开始给你带来困难之前,你宁愿先学习这些概念。只要你渴望学习,承认你对这些东西知之甚少并不是什么坏事。

我还在one of my answers 中设置了一个Asp.net MVC 应用程序架构的简化示例,它以非常肤浅的方式呈现了这些概念。但也可能会有所帮助。

【讨论】:

  • @Robert Koritnik 亲爱的罗伯特,对您回答的第一部分做出反应 - 该应用程序最初是我自己设计的。其次,没有其他人会折射它。是的,它打算在最后部署。好吧,我似乎不了解基本知识,这也可能是真的。我从来没有为网络环境做过任何真正的事情(除了少数相当静态的页面)。而且我也不是 .net 专家(更喜欢 Java)。我认为我是一个很好的桌面程序员,主要是在涉及 GUI 和非平凡的算法问题时。但我必须弄清楚......
  • ...说明如何做到这一点,因为没有其他人可以做到这一点。 MVC 对我来说是全新的方式——正如我作为桌面程序员所说的那样,我已经习惯了事件,我可能应该使用 Web 表单——但我不喜欢它们,我认为它们不适合 Web 环境,我不觉得就像控制他们的应用程序一样。所以赶上模式是我现在需要的。
  • @Robert Koritnik 至于第二部分 - 问题是我现在不在家,但在不同的国家,我会待一段时间。我不知道这里有任何人能够正确地解释我的想法,甚至不是分析师——甚至不会说我在这里说的语言。所以我正在尝试从网络中学习,但这会导致这种奇怪的问题......无论如何,感谢您提供指向您答案的链接。
  • @drasto:好的,我了解糟糕设计的背景。我还想向您指出我提供的第一个链接。您将在那里找到示例 Asp.net MVC 应用程序,这将帮助您快速掌握 Asp.net MVC 开发。既然您是 Java 开发人员:您是否考虑过为这个项目使用 JSP?即使您是桌面开发人员,这对您来说可能会更容易。只是一个想法:即使 Asp.net MVC 非常适合 HTTP 协议,您也不应该完全忽略 Web 表单。许多应用程序都可以很好地使用它。
  • @drasto:如果您正在开发一个胖客户端,那么您确实通过在 MVC 中做出了正确的决定。没关系。您所要做的就是创建您的 modelservicedata 层以获得更好的 SoC。然后放入真正属于它们的代码。
【解决方案2】:

为了让你找到正确的方向,我会看看我之前的问题,这可能会让你对使用依赖注入(使用 UNITY)的 MVC 结构和存储库模式的简单用法有所了解。

MVC, EF - DataContext singleton instance Per-Web-Request in Unity

在我的示例中,控制器“注入”了所需的依赖项,在本例中是所需的存储库。处理请求后,控制器与存储库一起被处理。

此外,我建议您将数据层保存在单独的程序集(项目)中。

【讨论】:

  • add " 我建议您将数据层保存在单独的程序集(项目)中。"已经这样做了。
  • @Drasto - 嗯,这很好。我真的建议你考虑使用像 Unity 这样的 IoC,用于例如您的存储库和服务类。它提供了良好的结构和非常灵活的架构。
猜你喜欢
  • 2012-01-10
  • 2012-11-01
  • 2012-03-09
  • 2021-03-19
  • 2017-10-19
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2016-06-09
相关资源
最近更新 更多