IoC和DI在Web应用中的优势

Advantages of IoC and DI in web applications

我正在学习一本手册中的依赖注入和控制反转,据我从示例中了解到,IoC 可以在应用程序初始化时应用。
当应用程序启动时,它会读取 xml spring 配置文件并使用它们的依赖项初始化 bean。 我理解这样做的好处,主要是完全松散的类的可测试性是一个很大的优势。 我想了解的是如何在基于 mvc 的 Web 应用程序上应用 IoC 和 DI,我已经在 SpringMVC 中构建了一个简单的 Web 应用程序(我通常使用 Stripes 开发),但我看不到如何利用 IoC 和Web 应用程序流程中的 DI,用户浏览网站、插入评论、提交表单、上传文件供后端读取和 return 一些结果,从数据库中获取数据。
所有这些操作当然是在应用程序初始化后(在 Web 服务器中)执行的,并且已经应用​​了 IoC。 所以我想了解它是否真的值得学习。 任何 advise/hint/comment/link 表示赞赏

在 MVC 应用程序中,您将有一些层。您有视图、控制器和模型,但在某些情况下,您还会有业务层和数据访问层。

我的建议是将项目分开,这样每一层都可以编译成自己的 .jar 文件(如果您在 .Net 上工作,则可以编译成 .dll 文件)。然后您需要留意从一个 jar 文件到另一个的引用。引用是一个不好的迹象,因为它们意味着你的层是耦合的。

那么如何保持图层彼此独立?您需要声明每个层的 public 接口。如果一个层需要另一个层(依赖),你不会添加对依赖的引用,而是需要依赖它的接口。

各层通过发送 POCO 相互通信。包含数据但不包含行为的普通对象。这些普通对象只是 类,并没有与框架紧密耦合。

我们这样做是因为它有助于我们将具体技术封装在一个层中。例如,您可以在数据访问层中使用休眠,但您希望将休眠保留在数据访问层中。您的控制器和业务层不需要知道您使用哪种数据访问技术。这将允许您在未来将您的技术替换为更现代的技术,而无需替换整个应用程序。

当您编写代码和编译代码时,您的层应该对其他层一无所知。他们唯一应该知道的是他们的接口。在运行时,IoC 容器将创建依赖项的实例并将它们注入到正确的位置。

  • 用户提交表单
  • 路由器识别所需的控制器
  • IoC 容器创建控制器实例
  • 控制器处理 HTTP 内容,它解析用户输入并创建一个 POCO 对象,然后将其传递到业务层 (BL)。 controller知道业务层接口,不知道具体实现。
  • 业务层将 POCO 转移到数据访问层 (DAL) 中的一些服务
  • 业务层知道 DAL 接口,但不知道用于数据存储的具体实现或具体技术。
  • DAL 和 BL 都是在运行时由 IoC 容器注入的。这允许层避免相互引用。

依赖倒置可以帮助您分离关注点,但它本身并不是什么大问题,它可能会让您认为这样做不值得。学习 DI 是第一步,但您还需要了解其他 4 个利用 DI 的 SOLID 原则和架构。

其中之一是洋葱架构:

您可以在以下位置了解更多信息:

http://blog.thedigitalgroup.com/chetanv/2015/07/06/understanding-onion-architecture/

我会推荐你​​阅读: