Pixel World

it's better be burning out than to fade away.

01. Functions

All functions in Haskell follow three rules that force them to behave like functions in
math:

  • All functions must take an argument.
  • All functions must return a value.
  • Anytime a function is called with the same argument, it must return the same
    value

The third rule is part of the basic mathematical definition of a function. When the rule
that the same argument must always produce the same result is applied to function in a
programming language, it’s called referential transparency.

02. LAMBDA FUNCTIONS AND LEXICAL SCOPE

Lambda functions

One of the most foundational concepts in functional programming is a function without
a name, called a lambda function (hence lambda calculus). Lambda functions are often
referred to using the lowercase Greek letter λ. Another common name for a lambda
function is an anonymous function.
alt

Practical lambda functions and lexical scope

IIFE works on exactly the same principles as our example of replacing a where statement. Whenever you create a new function, named or not, you
create a new scope, which is the context in which a variable is defined. When a variable is
used, the program looks at the nearest scope; if the definition of the variable isn’t there,
it goes to the next one up. This particular type of variable lookup is called lexical scope.
Both Haskell and JavaScript use lexical scoping, which is why IIFE and your lambda function variables behave in a similar fashion.

阅读全文 »

枚举(enum)

当一个变量有几种可能的取值时,可以将它定义为枚举类型,

  1. 当我们声明一个枚举类型是,虽然没有给它们赋值,但是它们的值其实是默认的数字类型,而且默认从0开始依次累加
  2. 因此当我们把第一个值赋值后,后面也会根据第一个值进行累加
  3. 枚举类型的值其实也可以是字符串类型
  4. 字符串枚举可以和数字枚举混合使用

枚举的本质 & 双向映射

枚举具有双向映射的特性,所谓双向映射指的是通过key可以索引到value,同时通过value也可以索引到key.
原因就在编译后的 JavaScript把枚举类型构造成为了一个对象,而由于其特殊的构造,导致其拥有正反向同时映射的特性
alt

常量枚举

枚举可以被 const 声明为常量,这样做的好处是,编译后的js代码中实际上是不存在枚举和枚举对象的,使用的是枚举的值,这是性能提升的一个方案。

如果你非要 TypeScript 保留对象 Direction ,那么可以添加编译选项 —preserveConstEnums

联合枚举类型

阅读全文 »

interface

概述

TypeScript的核心原则之一是对值所具有的结构进行类型检查,它有时被称做”鸭式辩型法”或”结构型子类型化”.
TypeScript里接口的作用就是为这些类型命名和为你的代码和第三方代码定义契约.
alt

可选属性 & 只读属性

alt

函数类型

alt

索引签名

通过定义key和value的类型宽泛的描述接口”形状”.
alt

阅读全文 »

typeScript类型系统

类型注解

基本注解采用 :TypeAnnotation语法,在类型声明空间中可用的任何内容都可以用作类型注解

原始类型

JavaScript 原始类型也同样适应于 TypeScript 的类型系统,因此 string、number、boolean 也可以被用作类型注解.

alt

数组

针对数组的类型注解有两种方式 :TypeAnnotation[] 或者 Array\,这两种方式是等价的
alt

接口

阅读全文 »

Asp.Net Core 文件系统

ASP.NET Core 具有很多针对文件读取的应用。比如我们倾向于采用JSON文件来定义配置,所以应用就会涉及针对配置文件读取。如果用户发送一个针对物理文件的HTTP请求,应用会根据指定的路径读取目标文件的内容并对请求予以响应。在一个ASP.NET Core MVC应用中,针对View的动态编译会涉及到根据预定义的路径映射关系来读取目标View文件。这些不同应用场景都会出现一个IFileProvider对象的身影,以此对象为核心的文件系统提供了统一的API来读取文件的内容并监控内容的改变。

物理文件系统

IChangeToken

由于IFileProvider提供了针对文件系统变换的监控功能,在.NET Core的世界里类似的功能大都利用一个IChangeToken对象来实现.从字面上理解的IChangeToken对象就是一个与某组监控数据关联的“令牌(Token)”,它能够在检测到数据改变的时候及时地对外发出一个通知。IChangeToken接口具有如下所示的三个成员。

alt

  • HasChanged:如果关联的数据发生改变,HasChanged属性将变成True.

  • ActiveChangeCallbacks:它表示当数据发生变化时是否需要主动执行注册的回调操作.

  • RegisterChangeCallback:注册一个在数据发生改变时可以自动执行的回调,该方法会以一个IDisposable对象的形式返回注册对象,所以我们应该在适当的时机调用其Dispose方法解除注册的回调.

IFileProvider

IFileProvider的接口定义如下图:

阅读全文 »

Asp.Net Core DI-服务消费

本系列博客均来源于大内老A关于Asp.NET Core的解读,在此进基础上进行了提炼,方便日后查看学习.
包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IServiceProvider对象。当需要消费某个服务实例的时候,我们只需要指定服务类型调用IServiceProvider的GetService方法,IServiceProvider就会根据对应的服务注册提供所需的服务实例。

IServiceProvider

IServiceProvider由ServiceCollection的BuildServiceProvider方法来生成,ServiceProvider只包含一个方法GetService(Type serviceType).如下图:

alt
IserviceProvider包含其他一些扩展方法,可以方便通过不同方式不用应用场景返回实例.如下图:

alt

  • GetService(this IServiceProvider provider):通过提供泛型类型T,返回对应实例,如果没有T对应的注册信息,返回null
  • GetServices(this IServiceProvider provider):通过提供泛型类型T,返回对应的多个实例
  • GetServices(this IServiceProvider provider, Type serviceType):传参的方式
  • GetRequiredService(this IServiceProvider provider, Type serviceType):如果指定服务类型的服务注册不存在,则会抛出一个InvalidOperationException类型的异常。如果所需的服务实例是必需的,我们一般会调用者两个扩展方法

构造函数的选择

如果IServiceProvider对象试图通过调用构造函数的方式来创建服务实例,传入构造函数的所有参数必须先被初始化,最终被选择出来的构造函数必须具备一个基本的条件:

阅读全文 »

Asp.Net Core DI-服务注册

包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IServiceProvider对象。服务注册就是创建出现相应的ServiceDescriptor对象并将其添加到指定IServiceCollection集合对象中的过程。IServiceCollection实际上是包含了ServiceDescriptor对象的集合.

ServiceDescriptor

IServiceCollection对象是一个存放服务注册信息的集合.在IServiceCollection/IServiceProvider为核心的DI框架中,与之对应的类型为ServiceDescriptor.

DI框架将服务注册存储在一个通过IServiceCollection接口表示的集合之中.如下面的代码片段所示,一个IServiceCollection对象本质上就是一个元素类型为ServiceDescriptor的列表.在默认情况下我们使用的是实现该接口的ServiceCollection类型.

ServiceDescriptor共有5个属性,3个构造函数,如下所示:

alt

属性说明:

  • ServiceType:注册的服务类型.往往是一个接口
  • ImplementationType:实现ServiceType接口的类
  • ImplementationInstance:已经实例化的对象
  • ImplementationFactory:提供对象的工厂方法.类型为Func
  • Lifetime:生命周期,枚举类型,对应有三个值,分别为:Singleton,Scoped,Transient
阅读全文 »

Asp.NET Core DI框架概览

毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动时构建请求处理管道的过程中,以及利用该管道处理每个请求过程中使用到的服务对象均来源于DI容器.该DI容器不仅为ASP.NET Core框架提供必要的服务,同时作为了应用的服务提供者,依赖注入已经成为了ASP.NET Core应用基本的编程模式.

服务的注册与消费

ASP.NET Core中的依赖注入框架中,我们添加的服务注册被保存到通过 IServiceCollection 接口表示的集合之中,基于这个集合创建的DI容器体现为 IServiceProvider.

DI框架提供了生产实例的三种生命周期模式,分别为:

  • Singleton:整个应用程序生命周期内单例
  • Scoped:单次服务请求内的单例
  • Transient:每次获取均会产生新的对象

DI框架注册服务时通常会使用三种方式,分别为:

  • 指定注册非服务类型和实现类型.
  • 指定一个现有的服务实例.
  • 指定一个创建服务实例的委托对象.

当我们在进行服务注册时,可以为同一类型添加一个服务注册,也可以添加多个,实际上添加的所有服务注册都是有效的,在完成服务注册之后,我们调用IServiceCollection接口的扩展方法 BuildServiceProvider创建出代表DI容器的IServiceProvider对象,并利用它调用后者的GetService方法来提供相应的服务实例,总时会返回一个服务实例,这里采用了”后来居上”的原则,即总是采用最近添加的服务注册来创建服务实例.如果我们调用另一个扩展方法GetServices,它将利用返回所有服务注册提供的服务实例.如下所示的代码片段.

阅读全文 »

Ioc原则对应的几种设计模式

概述

IoC仅仅是一种设计原则,针对IoC的设计原则有多种设计模式,例如:模板方法,简单工厂,抽象工厂等.以下通过这三种设计模式阐述如何实现IoC设计原则的.

模板方法

该模式主张将一个可复用的工作流程或者由多个步骤组成的算法定义成模板方法,组成这个流程或者算法的步骤实现在相应的虚方法之中,模板方法根据按照预先编排的流程去调用这些虚方法。所有这些方法均定义在同一个类中,我们可以通过派生该类并重写相应的虚方法达到对流程定制的目的。

工厂方法

对于一个复杂的流程来说,我们倾向于将组成该流程的各个环节实现在相对独立的组件之中,那么针对流程的定制就可以通过提供定制组件的方式来实现。我们知道23种设计模式之中有一种重要的类型,那就是“创建型模式”,比如常用的“工厂方法”和“抽象工厂”,IoC所体现的针对流程的共享与定制可以通过它们来完成。

所谓的工厂方法,说白了就是在某个类中定义用于提供依赖对象的方法,这个方法可以是一个单纯的虚方法,也可以是具有默认实现的虚方法,至于方法声明的返回类型,可以是一个接口或者抽象类,也可以是未被封闭(Sealed)的具体类型。作为它的派生类型,它可以实现或者重写工厂方法以提供所需的具体对象。

抽象工厂

阅读全文 »

Asp.Net Core IOC模式

本系列文章来源于大内老A的博客,对博客内容进行了略微整理,方便自己以后查阅.

IoC名词解释

IoC全名为Inverse of Control,含义为”控制倒置”,针对软件设计行业来说,IoC所谓的控制其实是”针对流程的控制”.控制权原来在应用程序,应用程序可以根据自己的场景定义流程,而IoC原则主张流程的控制权转移到框架中,由框架来定义流程的步骤,我们可以通过下图来说明控制权的转移过程.

alt

流程定制

我们采用IoC实现了流程控制从应用程序向框架自身的反转,但是这个被反转的仅仅是一个泛化的流程,任何一个具体的应用都可能需要对组成该流程的某些环节进行定制.作为一个Web框架,用户认证功能是必备的,但是框架自身不能限制于某一种或者几种固定的认证方式,应该通过扩展的方式让用户可以自由地定制任意的认证模式。

我们可以说得更加宽泛点。如下图所示我们将一个泛化的工作流程(A=>B=>C)被定义在框架之中,建立在该框架的两个应用需要对组成这个流程的某些环节进行定制。比如步骤A和C可以被App1重用,但是步骤B却需要被定制(B1),App2则重用步骤A和B,但是需要按照自己的方式处理步骤C。

alt

阅读全文 »
0%