Pixel World

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

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

阅读全文 »

JavaScript的组成部分

  • ECMAScript:由ECMA-262定义,提供核心语言功能
  • 文档对象模型(DOM):提供访问和操作网页内容的方法和接口
  • 浏览器对象模型(BOM):提供与浏览器交互的方法和接口

变量 作用域和内存问题

JavaScript的变量与其他语言有很大区别.不存在定义某个变量必须要保存何种数据类型值的规则,变量的值以及数据类型可以在脚本的生命周期内改变.

复制变量值

  • 从一个变量向另一个变量赋值基本类型的值,会在变量对象上创建一个新值,然后把该值赋值带为新变量分配的位置上.

  • 当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份跟放到为新变量分配的空间中,不同的是,这个值的副本实际上是一个指针.而这个指针指向存储在堆内存中的一个对象.

传递参数

Js中所有函数的参数都是按值传递的.不同的是,对于基本类型的值来说,被传递的值会复制给一个局部变量.对于引用类型的值,会把这个值在内存中的地址复制给一个局部变量.因此这个局部变量的变化会反映在函数的外部.

检测类型

阅读全文 »

嵌入方式

css有三种样式嵌入方式,分别为内联,嵌入,外部引用,一般情况下优先级为内联样式表>嵌入样式表>外部样式表,前提是外部引用css文件在嵌入的前边,如果外部引用在嵌入的后边那么外部引用的优先级将高于嵌入的。简而言之,css优先级是以离标签的距离为依据的。

CSS选择器

并集选择器

取所有选择器所选择元素的并集,然后集中设置样式,语法为在每个选择器中间加上逗号,格式如下:

1
2
3
Selector1,selector2{
属性:值;
}

交集选择器

给所有选择器选中的标签中,相交的那部分标签设置属性。格式:

1
2
3
Selector1Selecotr2{
属性:值;
}

注:Selector1和selector2之间没人任何符号也没有空格。

阅读全文 »

引用标签

引用标签会自动对其中的内容加入双引号,有单行文本和长段文本两种方式:

<q>引用标签</q> //适用单行文本

<blockquote>引用标签</blockquote> //长段文本

实体字符

在html中输入多个空格是不起作用的,并且换行也会被当做一个空格来看待,如果需要多个空格请使用实体字符,如:&nbsp;

地址

<address>地址</address> //显示地址

程序代码

<code>代码</code>  //显示程序代码
<pre>大段代码</pre> //显示大段代码

表格摘要

摘要的内容是不会在浏览器中显示出来的。它的作用是增加表格的可读性(语义化),使搜索引擎更好的读懂表格内容,还可以使屏幕阅读器更好的帮助特殊用户读取表格内容。语法表示:

<table summary="表格简介文本"></table>

使用mailto在网页中连接Email地址

<a href="mailto:yy@imooc.com?subject='观了不起的盖茨比有感'&body='你好,对此评论有些想法'">发送邮件给我</a>

Label

用于绑定input在用户点击label标签的文字后即可聚焦input,有两种绑定方式。
方式一:

1
2
3
4
5
6
<form action=" " method="post">
<label for=”account”>账号</label>
<input type=”text” id=”account”/>
<label for=”pwd”>密码</label>
<input type=”text” id=”pwd”>
</form>

方式二:

1
2
3
4
5
6
7
8
<form action=" " method="post">
<label>
账号:<input type=”text”/>
</label>
<label>
密码:<input type=”password”/>
</label>
</form>

HTML5 DTD文档类型声明

<!DOCTYPE html> //必须位于html文档的第一行
阅读全文 »

概述


Hexo是一个快捷、简单、功能强大的个人博客框架,使用Node.js下载与安装,上百个文件仅需几秒就可以安装完毕;Hexo的页面使用Markdown语法,简洁高效;通过简单的命令即可发布到网站,支持发布到GitHub Pages Heroku和其他站点;同时Hexo拥有丰富强大的插件系统,可以根据个人需要进行安装。本文主要针对技术开发人员如何快速的搭建Hexo博客做一个详尽的教程,也是对自己在搭建博客的过程中遇到的问题进行总结,避免以后的小伙伴踩坑。本文从五个方面进行讲解,分别为:

  • 环境部署
  • HEXO安装与常用命令
  • 个性化设置
  • HEXO部署Github
  • 定制化个性域名

阅读全文 »
0%