【week02】作业
作业1 请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置原则是指一种特定的解耦(传统的依赖关系创建在高层次之上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖与敌层次模块的实现细节,依赖关系被反转,从而使得低层次模块依赖于高层次模块的需求抽象。
该原则规定:
1. 高层次的模块不应该依赖于低层次的模块,两者应该依赖于抽象接口
2. 抽象接口不应该依赖于具体的实现,而具体的实现则应该依赖于抽象接口
好莱坞原则:don’t call us,we will call you。
就是在架构设计中,架构定义一系列规约,组件实现规约即可。由框架来初始化组件和调用组件实现的接口,而不是组件来调用框架的api。这里体现的是ioc,控制的反转或者说依赖的反转。
作业2 请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
在.NET Core中DI的核心分为两个组件:IServiceCollection和 IServiceProvider。
IServiceCollection 负责注册
IServiceProvider 负责提供实例
通过默认的 ServiceCollection(在Microsoft.Extensions.DependencyInjection命名空间下)有三个方法:
var serviceCollection = new ServiceCollection()
.AddTransient<ILoginService, EFLoginService>()
.AddSingleton<ILoginService, EFLoginService>()
.AddScoped<ILoginService, EFLoginService>();
我们上面的AddTransient、AddSignletone和Scoped方法是IServiceCollection的扩展方法, 都是往这个List里面添加ServiceDescriptor。
Transient: 每一次GetService都会创建一个新的实例
Scoped: 在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)
Singleton :整个应用程序生命周期以内只创建一个实例
例如在编写IndexModel:PageModel模块时,依赖于一个TestDependency,那这里需要定义一个ITestDependency接口,同时在IndexModel类的构造方法里声明参数 ITestDependency itd;这样IndexModel不需要知道这个接口的实现细节,只需要按照根据业务需要定义和使用这个接口。这个接口的实现例如为MyTestDependency : ITestDependency,同时在系统的startup的configureServices里这个实现类加入services里(或者用配置文件的方式)。那么容器就会自动组装IndexModel
作业3 请用接口隔离原则优化 Cache 类的设计,画出优化后的类图
如上图所述,CacheUser依赖于接口ICacheClient,其中包含get,put,delete方法,另外一个接口ICacheBuilder定义了reBuild方法。而实现类CacheClient实现了这两个接口。这样在CacheUser中使用接口ICacheClient,从而实现了对reBuild方法的隔离
评论