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/
我会推荐你阅读:
我正在学习一本手册中的依赖注入和控制反转,据我从示例中了解到,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/
我会推荐你阅读: