C#.NET面试题汇总系列六:ASP.NET Core

1. 什么是依赖注入?

依赖注入是一个过程,就是当一个类需要调用另一个类来完成某项任务的时候,在调用类里面不要去new被调用的类的对象,而是通过注入的方式来获取这样一个对象

具体的实现就是在调用类里面有一个被调用类的接口,然后通过调用接口的函数来完成任务。比如A调用B,而B实现了接口C,那么在A里面用C定义一个变量D,这个变量的实例不在A里面创建,而是通过A的上下文来获取

这样做的好处就是将类A和B分开了,他们之间靠接口C来联系,从而实现对接口编程

常见的框架:Unity、autofac、spring.net、MEF、Injection、Asp.Net Core的ServiceCollection

2. 控制反转是什么?

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度

其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)

通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它

3. 依赖注入有哪几种方式?

setter注入:就是在类A里面定义一个C接口的属性D,在A的上下文通过B实例化一个对象,然后将这个对象赋值给属性D。主要就是set 与 get

构造函数注入:就是在创建A的对象的时候,通过参数将B的对象传入到A中

4. 依赖注入实现原理?

实现DI,核心在于依赖注入容器IContainer,该容器具有以下功能

  • (容器)保存可用服务的集合(要用的特定对象、特定类、接口服务)
  • (注册)提供一种方式将各种部件与他们依赖的服务绑定到一起
  • (解析点)为应用程序提供一种方式来请求已配置的对象: 构造函数注入、属性注入

运行时,框架会一层层通过反射构造实例,最终得到完整对象

5. 如何在controller中注入service?

在configservices方法中配置这个service

在controller的构造函数中,添加这个依赖注入

6. 谈一谈对DDD的理解?

DDD,领域驱动设计。就是通过领域来指导软件设计,是一种十分抽象的软件设计思想,它主要分为战略设计和战术设计

战略方面,通过事件风暴进行领域模型的划分,划分出核心域,子域,支撑域,定义通用语言,划分出界限上下文

在战术设计方面,ddd将架构分层,“松耦合,高内聚”是架构设计的整体思想。按照DDD思想,可以分为领域层,基础设施层,应用层,接口层

7. ASP.NET Core 比 ASP.NET的优势

跨平台,ASP.NET Core 可以运行在 Windows 、Linux 和 MAC 系统上

对框架本安装没有依赖,所有依赖都跟程序本身在一起

ASP.NET Core 处理请求的效率更高,进而可以处理更多的请求

ASP.NET Core 具有更多的安装配置方法

8. asp.net core 主要的特性

依赖注入

日志系统架构

引入了一个跨平台的网络服务器,kestrel。可以没有iis, apache和nginx就可以单独运行

可以使用命令行创建应用

使用AppSettings.json 来配置工程

使用start up来注册服务

更好的支持异步编程

支持web socket和signal IR

对于跨网站的请求的预防和保护机制

9. 什么是dot net core的startup class

Startup class是dot net core应用的入口。所有的dot net core应用必须有这个class。这个类用来配置应用。这个类的调用是在program main函数里面进行配置的。类的名字可以自己定义

10. ASP.NET Core 中AOP的支持有哪些

通过Filter来支持;分别有IResourceFilter AuthorizeFilter ActionFilter ExceptionFilter ResultFilter

11. ASP.NET Core Filter如何支持依赖注入

可以通过全局注册,支持依赖注入

通过TypeFilter(typeof(Filter)) 标记在方法,标记在控制器

通过ServiceType(typeof(Filter))标记在方法,标记在控制器,必须要注册Filter这类;

TypeFilter和ServiceType的本质是实现了一个IFilterFactory接口

12. Asp.Net Core中有哪些异常处理的方案?

  • 继承Controller,重写OnActionExecuted
  • 使用 ActionFilterAttribute
  • 使用 IExceptionFilter
  • 使用ExceptionHandler
  • 自定义Middleare处理

13. 什么是中间件(Middleware)?

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

选择是否将请求传递给管道中的下一个组件。

可以在调用管道中的下一个组件之前和之后执行工作。

请求委托(Request delegates)用于构建请求管道,处理每个HTTP请求。

请求委托使用Run,Map和Use扩展方法进行配置。单独的请求委托可以以内联匿名方法(称为内联中间件)指定,或者可以在可重用的类中定义它。这些可重用的类和内联匿名方法是中间件或中间件组件。请求流程中的每个中间件组件都负责调用流水线中的下一个组件,如果适当,则负责链接短路

14. 中间件的使用场景有哪些?

身份验证,Session存储,日志记录等

15. dot net core里面的路由是如何处理的?

路由处理是用来为进入的请求寻找处理函数的机制。所有的路由在函数运行开始时进行注册

主要有两种路由处理方式, 常规路由处理和属性路由处理

常规路由处理就是用MapRoute的方式设定调用路由,属性路由处理是指在调用函数的上方设定一个路由属性

16. startup class的configure方法有什么作用?

这个方法来定义整个应用如何响应HTTP请求。它有几个比较重要的参数,application builder,Hosting environment, logo factory, 在这里我们可以配置一些中间件用来处理路径,验证和session等

17. 说说ASP.NET Core内置容器的特点

ASP.NET Core内置容器IServiceCollection,只支持构造函数注入

支持三种声明周期:单例、瞬时、Scoped三种声明周期管理

18. 介绍ASP.NET Core中服务的生命周期?

Singleton --单例模式:

只有一个服务的实例被创建,这个实例,存储在内存中,可以在整个应用程序中使用

Scoped --作用域

这种模式下,将会为每一个请求,都创建一个服务的实例。所有同一个请求中的中间件、MVC控制器等,都会得到一个相同的服务实例

Transient --短暂的、瞬变的  
Transient模式下,服务每次被请求的时候,都会创建一个服务实例,这种模式特别适合轻量级、无状态的服务

19. 数据库的连接池使用什么方式注入?

services.AddDbContextPool<DbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SQL")), poolSize: 64);
posted @ 2022-03-01 14:24  位永光  阅读(660)  评论(0编辑  收藏  举报