架构师训练营 Week2
作业1
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
总结一句话说,程序要依赖于抽象接口,也就是要求对抽象编程,不依赖于具体实现细节,降低模块间的耦合度。
在传统的MVC框架中,Controller层的业务逻辑不依赖于业务层的Business实现细节,依赖倒置又称控制反转,高层模块不会因为底层模块的改动而变化,面向接口编程,将实现细节注入到容器,通过反射获取到对应的应用实例实现业务细节。
好莱坞原则----不要调用我,让我来调用你
这是一种典型的控制反转方式,没有依赖倒置的情况下,原本高层需要依赖与底层的具体实现,产生了直接耦合依赖关系,加入依赖倒置后,高层实现只需要依赖于独立的接口层,基于接口编程,需要用到底层的功能,直接从容器中取出调用即可。
作业二
请描述一个你熟悉的框架,是如何实现依赖倒置原则的
依赖注入框架大体分为以下几个步骤:
构建一个服务容器工厂
在服务容器工厂中注入服务生成规则
根据服务容器工厂生成服务容器
通过服务容器获取服务
asp.net core 3.1 mvc框架中在程序第一次启动过程,首先构建服务容器工厂,随后会初始化将接口及实现依次注入到容器字典对象ServiceCollection内,其次kestral服务器会监听来自端口的http请求,当请求到达后,根据路由规则,解析对应的controller及action中,此时controller如果有依赖于底层的DAL层的实例对象,会从最开始的容器中取出对应的实例对象,通过反射方法依次注入初始化执行对应的controller及action。
这里的容器生命周期又分为以下三种:
作业三
请用接口隔离原则优化 Cache 类的设计,画出优化后的类图
cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法
根据上图,将Cache接口拆分成两个接口,ICache以及IRemoteCache, ICache主要包括get,put,delete方法,IRemoteCache接口主要包括reBuild方法,当应用层需要使用时,使用ApplicationCache,与不需要的reBuild接口进行隔离,避免用户使用错误,当远程调用时,使用RemoteCache, 分别继承实现ICache和IRemoteCache, 这样既保证了原有的Cache功能,又不丢失reBuild功能,两者互不干扰,见下文设计图。
评论