依赖注入(DI)是IOC(控制反转)思想的实现。通过DI容器来统一管理所有的服务生命周期,服务的创建、销毁和获取都由DI容器处理。依赖注入大大减少了服务之间的依赖关系,实现了服务之间依赖抽象化,而不是依赖具体的实现。它还能够解析所有服务依赖关系树,并直接使用服务。优点包括解耦、生命周期管理、提高可维护性和服务可替代性。
依赖注入的原理和优点
-
依赖注入(DI),是IOC控制反转思想 的实现。由一个DI容器,去统一管理所有的服务生命周期,服务的创建、销毁、获取,都是由DI容器去处理的。
-
依赖注入,很大程度解耦了服务之间的依赖关系,服务之间依赖的是抽象(依赖的是 服务/服务接口 的 “类型”),而不是依赖具体的实现(服务不用关注他依赖的服务的创建,仅通过构造函数声明依赖的服务类型即可拿到依赖的服务实例,实际的服务实例是由容器去创建出来的)。
-
在获取服务时,DI能够解析所有服务依赖关系树,将所有直接、间接依赖的服务都创建了出来(不同的生命周期类型,创建的时机不同,见1.3),可以直接使用。
-
优点:解耦、生命周期管理、提高可维护性、服务可替代性。(服务之间的依赖仅是类型,不关注依赖服务的创建,因此任何服务的改动,之间的影响是非常微小的,并且依赖的接口服务,在注册时候接口的实现可以直接替换。)
-
.net framework中 new() 创建服务,缺点:服务之间依赖的是具体的实现,依赖的服务需要手动创建出来,任何服务的改动,影响都是非常多的地方。当服务依赖层级很深的时候,外层服务使用底层服务,需要按个从低到把所有依赖的服务都创建出来。当其中某个服务构造函数发生变化时,所有用到他的地方,创建都需要更改,影响会很大,不利于维护。并且需要手动控制一些非托管资源服务的生命周期,需要注意内存泄漏的问题。