本文主要是介绍2、AspNetCore StartUp,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
写作原因:入门AspNetCore有段时间了,但是对依赖注入和控制反转不是很清楚,先将一点思考记录下来,如有不对的地方,请多多指教。
一、概念明确
大部分程序员写的程序都是应用程序,针对一个方案,由顶层架构师设计好架构或者选择使用哪些框架,然后下面的人开始写业务流程控制。除了大厂会自己开发框架(当然也有部分基于开源进行二次开发的),小厂基本都是基于开源框架进行二次开发或者就是使用开源框架进行开发,内部再进行业务流程开发。所以下面引出Ioc--控制反转。
IOC:控制反转(Inverse of Control),控制--什么的控制?笔者认为是业务流程的控制,反转(倒置)又是什么意思?笔者认为这就是将我们自己写的应用程序中的流程控制反转给框架。下面两张图截取自引文1
图1展示了将应用程序控制的业务流程反转给框架,这有什么好处呢?图2给出了好处,我们可以对框架给的标准流程中不适合本业务的部分进行定制开发,就是说我们不需要重复造轮子,只需要把精力放在所开发的应用程序的业务流程上就可以。
所以IOC可以说是一种设计思想,模板方法、工厂方法和抽象工厂都是这种思想的实现方法,依赖注入(DI:Dependency Injection)也是其中的一种。
在搜索相关资料时经常会提到服务,平常做对接时也是我这边写个服务接口之类的话,这里服务、接口每个人对不同框架理解的也不一样,这个也没必要纠结,只要对接双方都理解就可以。本文笔者这里说的服务是针对ASP.NET Core框架所说的,指的是开发者自己开发的接口类型的服务,例如下面这种。
public interface IMService{}
DI旨在实现针对服务对象的动态提供。具体来说,服务的消费者利用一个独立的容器(Container)来获取所需的服务对象,容器自身在提供服务对象的过程中会自动完成依赖的解析与注入。话句话说,由DI容器提供的这个服务对象是一个” 开箱即用”的对象,这个对象自身直接或者间接依赖的对象已经在初始化的工程中被自动注入其中了。
上面这句话如果感觉不好理解的话,下面通过几段代码讲解下。首先依赖注入目前来说由三种,分别是构造器注入、属性注入、方法注入。笔者目前主要用到构造器注入,下面就构造器注入来讲,后面有遇到其他方法的问题是再总结。
public class DITest{public IMService _firstService{get; private set;}public DITest(IMService _fs){this._firstService= _fs;}}
IMService就是前文我们说的服务,是接口类型的。可以看到DITest类通过构造函数将IMService注入其体内,那怎么实现的服务对象的解析以及服务和服务对象的关联的?这里就能体现前面说的IOC的优势了,本来这些服务的解析及对应都需要开发者自己在应用程序中去写,没换一个项目就需要copy下,然后改改,现在都由反转给框架帮我们去实现了,来看下core里面的需要怎么做。
Startup里面通过ConfigureServices进行的。
这里好多文献都称其为注册,笔者之前迷惑了很久,这里注册的是什么,因为官网代码是方式1,网络代码是方式2,经后来研究发现,其实目的是一样的,官网是最直接的方式,网络上的是对官网做了一层封住,这样可能更适合自己的业务流程吧。
通过这样一种注册,就把IMService和MService绑定在一起来,当我们去请求IMService时候,容器就自动返给我们MService对象。
再回头来看前面的那段话是不是就好理解了。这个容器就是框架提供的DependencyInjection来实现的,至于为什么这个框架有这个能力,可以去看看源码中怎么实现的,这里不做细究。
二、步骤
如果自己开发的话,官网那种单一的注册方案就不合适了,需要对自定义的服务及服务对象做一个封装,因此需要两步准备,第一步是自定义服务,第二步是写一个扩展方法用来注册服务。
一、自定义服务
没什么特别的,写一个接口,然后再写一个实现接口的类
public class IMService{public string GetString();}public class MService : IMService{public string GetString(){return "这是我的服务";}}
二、注册服务
两种方法,一种是使用框架自带的注入方法
services.AddSingleton<IMService, MService>();
或者
services.AddScoped<IMService, MService>();
或者
services.AddTransient<IMService, MService>();
第二种方法封装一层再注册。这里需要写一个扩展方法。
public static class MServiceExtensions{public static void AddMService(this IServiceCollection services){services.AddScoped<IMService, MService>();}}
总的来说都是通过 IServiceCollection进行注册。
三、总结思考
控制反转:控制的是什么?反转是谁和谁之间的转换?
依赖注入:注入的是什么?怎么注入?注入后怎么做?
引用文献:ASP.NET Core中的依赖注入(1):控制反转(IoC) - Artech - 博客园
这篇关于2、AspNetCore StartUp的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!