面试官:. NET5源码里用到了哪些设计模式?懵!

作为微软最早迈向开源的重要软件之一,.NET 5的发布具有重要意义!

微软希望 .NET Framework 开发者能够迁移他们的代码和应用到 .NET 5.0 上,为明年发布的 .NET 6.0 将 Xamarin 开发者过渡到统一平台奠定基础。

版本发布时间轴:

.NET 5.0是我们的.NET统一之旅的第一个版本。构建.NET 5.0是为了让更多的开发人员能够将他们的.NET Framework代码和应用程序迁移到.NET5.0。

自首个预览版发布以来微软已经进行了广泛的内部部署,除了在 .NET 5.0 上运行 .NET 网站外,Bing 也在使用这个新平台。

ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制ASP.NET通过定义接口的方式对它们进行了“标准化”,我们将这些标准化的组件称为服务,ASP.NET在内部专门维护了一个DI容器来提供所需的服务。要了解这个DI容器以及现实其中的服务提供机制,我们先得知道什么是DI(Dependence Injection),而一旦我们提到DI,又不得不说IoC(Inverse of Control)。

.NET5核心IOC容器如何实现

我听到很多人将IoC说成是一种“面向对象的设计模式”,但IoC不能算作一种“设计模式”!

1、工厂模式

工厂模式(Factory Pattern)是 C# 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

依赖注入框架中有着大量的工厂模式的代码,注册服务的时候我们可以通过一个工厂方法委托来获取服务实例.

依赖注入的本质就是将对象的创建交给 IOC 容器来处理,所以其实 IOC 容器本质就是一个工厂,从 IOC 中获取服务实例的过程就是工厂创建对象的过程,只是会根据服务的生命周期来决定是创建新对象还是返回已有对象。

其他的一些使用场景例如:日志记录器、数据库访问。

2.抽象工厂模式

围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

使用场景:QQ 换皮肤,一整套一起换;生成不同操作系统的程序。

3.策略模式

一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

asp.net core 中的认证和授权,就是策略模式的应用,在使用 [Authorize] 的时候会使用默认的 policy,也可以指定要使用的策略 [Authorize(“Policy1”)] 这样就会使用另外一种策略 Policy1,policy 还是比较简单的。

而不同的认证模式(Cookie/JWT/自定义Token等)其实是不同的处理方法,也就是策略模式中不同的算法实现,指定哪种认证模式,就是使用哪种算法实现来获取用户信息。

4.综合案例实战:(手写.NET5 IOC源码)

可能有的朋友还是区分不了依赖倒置、依赖注入、控制反转这几个名词,或许知道的也只是知道依赖倒置是原则,依赖注入、控制反转都是实现的方式,我将在下面课程做详细的介绍,在篇幅的最后还会自己实现了IoC容器的功能。

.NET5的执行引擎Middleware源码如何实现

1.责任链模式

为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

使用场景:1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。3、可动态指定一组对象处理请求。asp.net core 中间件的设计就是责任链模式的应用和变形。

每个中间件根据需要处理请求,并且可以根据请求信息自己决定是否传递给下一个中间件,我也受此启发,封装了一个 PipelineBuilder 可以轻松构建中间件模式代码。

2.迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。

这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

C#中Array 和 List 各自实现了自己的迭代器,是非常经典的迭代器模式!

3.空对象模式

在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。

在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。

4.综合案例实战:(手写.NET5 Middleware源码)

学习.NET 5必须学习中间件,中间件是什么?

中间件是组装到应用程序管道中以处理请求和响应的软件。

我们经常在startup的configure中调用的app.use()方法,其实也就是向这个集合中添加一个middleware,Context进入后,必须被该Middleware处理。

ASP.NET Core Middleware是在应用程序处理管道pipeline中用于处理请求和操作响应的组件。

研究.NET5的源码,是一件非常枯燥、艰巨的事情,从设计模式的角度去研究,是一个很好的办法,也就是探究.NET5源码底层哪些用到了设计模式,运用这些设计模式,如何去手写.NET5底层核心内容,通过这种方法,相信对你识.NET5底层,提升自身实战能力有很大的帮助!

.NET5内部技术架构集训营

2020年12月22日~23日晚8点~9点30,.NET资深架构师Tony老师,将带领带领大家开启《纯手写.NET 5源码+设计模式》三天特训营,带领大家深入解读源码,手撸设计模式!

超多资料,免费领取

添加微信:ruanmou_xy

仅限前100名免费领取!

送完恢复原价!

dotNET跨平台
我还没有学会写个人说明!
上一篇

如何在 C# 中使用 数据注解

下一篇

这两道阿里面试题,难住了90%的面试者

你也可能喜欢

评论已经被关闭。

插入图片