2、AspNetCore StartUp

2023-10-16 14:48
文章标签 aspnetcore startup

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/220222

相关文章

oracle startup失败,ORA-01078: failure in processing system parameters

SQL> startup ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file '/data/oracle/product/11.2.0/db_1/dbs/initorc1.ora'   出错的原因可能是:文件名字不正确,文件权限不对,文件不存在,文件损坏 下面以文

为什么不去创业——Why to Not Not Start a Startup

2007年Y Combinator伯克利CSUA举行的创业公司培训课上,分享了人们不愿意选择去创业的十几个因素。虽然目前经济形势、社会环境都十分有利于年轻人创立自己的公司,可大多数人依然选择去到一个大公司做一件平凡的工作,为什么?Paul Graham从社会、家庭、经济、个人心理等十六个角度阐述了人们不选择创业的理由,并对其中绝大多数理由进行驳斥,鼓励年轻人勇敢的迈出创业的步子,拥抱这样一个充

windows环境下,点击tomcat的startup.bat闪退问题

前言 最近在本地测试项目的时候,小编在本地解压了三个tomcat,需要将三个tomcat同时运行,可是当点击bin目录下的startup.bat时,黑框框出现闪退问题,以下是问题解决方案。 更改端口号 由于要同时运行三个tomcat,每个tomcat要运行在不同的端口上,所以要更改默认的配置文件-server.xml,这个配置文件在conf目录下面,更改的地方有一下几点。1、<Server

QT 调试时出现 During startup program exited with code 0xc0000135 错误

QtCreator创建工程,ctrl+r调试,出现: 我装的是QT creator 5.70 ,出现上述原因是动态库加载不成功。但是QtCreator 不会提示什么动态库,具体缺乏什么动态库要用VS新建一个工程调用才可以看到,这也是QT Creator很大的bug。 实际上,系统文件夹System32下缺少msvcp120d.dll和msvcr120d.dll。 分别搜索“msvcp

web.xml之load-on-startup

如下一段配置,熟悉DWR的再熟悉不过了: <servlet>    <servlet-name>dwr-invoker</servlet-name>    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>    <init-param>     <param-name>deb

Keil C中startup.a51的作用【转】

启动文件. 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数. 和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char data xxx="100";,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51==

EFM8SB20 boot_startup 启动文件分析

$NOMOD51 $NOMOD51 $INCLUDE (REG932.INC) 解释: $NOMOD51,这一指令功能是使A51不识别8051的所有预定义符号。 $INCLUDE (REG932.INC),这一指令功能使用用户自定义的符号文件。 这两条语句必须配合使用,使用了$INCLUDE (REG932.INC),就必须使用$NOMOD51,否则回因多重定义而产生错误。 ; ; C

ASP.NET Core获取已经在Startup.cs中注册的服务实例

新版本.NET5参考代码 using Microsoft.AspNetCore.Hosting;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.Hosting;using Microsoft.Extensions.Logging;using System;using System.Collectio

webapi用Swashbuckle.AspNetCore报Internal Server Error /swagger/v1/swagger.json错误,解决

解决办法 必须要将所有的action方法头都要加上 [Route(“api/report/page”)],比如[HttpPost(“TargetSourse”)],比如 [Route(“api/report/page”)],此处为简写 参考代码 [Route("[controller]")]public class ChartDataController : Controller{

由于初始化参数文件修改错误导致oracle无法startup

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> alter system set db_block_buffers=1000 sc