前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >拥抱.NET Core系列:依赖注入(1)

拥抱.NET Core系列:依赖注入(1)

作者头像
落跑架构师M
发布2020-02-11 16:24:39
4820
发布2020-02-11 16:24:39
举报
文章被收录于专栏:落跑架构师M落跑架构师M

DIP、IoC、DI

说起DI不得不提IoC这个模式,很多人会把DI和IoC混为一谈,但其实这两者是概念和实现的关系。

依赖倒置原则(DIP):软件设计原则,要依赖于抽象,不要依赖具体实现。

控制反转(IoC):一种实现DIP原则的模式。

依赖注入(DI):IoC的具体实现。

DIP就好比一个目标一个法则。

IoC就好比是论文,“应该怎么做才能遵循DIP”

DI就好比是实际的产品,“落实到具体的语言的工具”

关于这个比喻可能不是很准确,大家可以使用搜索引擎去了解更为详细的差异。

在 .NET

在我接触的很多.NET项目中,很少有人使用DI,更别提像Orchard那样把DI用得出神入化。

而复杂的代码很大一部分的原因是没有引入DI。

在java中几乎从刚入门的新手都使用Spring提供的DI。

依赖注入生命周期

生命周期是指对服务实例的存活状态控制,"Microsoft.Extensions.DependencyInjection"提供了一个枚举定义了三种生命周期状态。

类型

描述

Singleton

单例服务

从当前服务容器中获取这个类型的实例永远是同一个实例。

Scoped

域内单例

为每个作用域创建一个服务实例,也就是说域内单例(域类似子容器)。

Transient

瞬态

从服务容器中每获取一次创建一个新的实例。

用例服务

代码如下:

注册服务的N种姿势

其实可以很容易的看出,服务注册是通过创建一个“ServiceDescriptor”来完成的,而其它方式的注册只不过是基于一个方法的封装而已,让使用者可以更为方便的进行服务注册。

我们可以通过很多手段去注册一个服务,但这里推荐大家优先使用扩展方法进行服务注册,因为这样的代码更易读。反射循环注入时可以使用其它方式。

服务使用

首先我们来看一下服务提供者提供的方法签名。

可以发现与服务注册一样,基于同一个方法提供了很多扩展方法让使用者更加便捷的获取服务。

我们先来看“GetService<T>”与“GetRequiredService<T>”这两个方法。

这两个方法非常接近,唯一不同的是GetRequiredService会在找不到服务的时候抛出异常,而GetService在找不到服务时会返回null。

服务的生命周期

我们可以通过运行结果很好的理清各个生命周期的用意。下面用一张图来说明较复杂情况下“scope”的服务结果。

小技巧

注册支持延迟加载的服务

开发过程中经常有一种情况,服务A的A方法依赖了服务B,而服务A的B方法依赖了服务C,这时候你就得在构造函数上同时声明服务B和C,就像这样。

这在其它DI组件中非常常见,比如autofac。而在现在我们需要这样做:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 落跑架构师M 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档