关于asp.net-core:IOC容器技术ServiceCollection

前言什么是依赖注入?依赖注入(Dependency Injection),简称DI。 因为某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只定义一个注入点。在程序运行过程中,客户类不间接实例化具体服务类实例,而是客户类的运行上下文环境或专门组件负责实例化服务类,而后将其注入到客户类中,保障客户类的失常运行。依赖关系反转应用程序中的依赖关系方向应该是形象的方向,而不是实现详细信息的方向。 大部分应用程序都是这样编写的:编译时依赖关系顺着运行时执行的方向流动,从而生成一个间接依赖项关系图。 也就是说,如果类 A 调用类 B 的办法,类 B 调用 C 类的办法,则在编译时,类 A 将取决于类 B,而 B 类又取决于类 C,如图所示 间接关系依赖利用依赖关系反转准则后,A 能够调用 B 实现的形象上的办法,让 A 能够在运行时调用 B,而 B 又在编译时依赖于 A 管制的接口(因而,典型的编译时依赖项产生反转)。 运行时,程序执行的流程放弃不变,但接口引入意味着能够轻松插入这些接口的不同实现。 反转依赖项关系图依赖项反转是生成涣散耦合应用程序的要害一环,因为能够将实现详细信息编写为依赖并实现更高级别的形象,而不是相同。 因而,生成的应用程序的可测试性、模块化水平以及可维护性更高。 遵循依赖关系反转准则可实现依赖关系注入。NET 中的依赖关系注入.NET 反对依赖关系注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现管制反转 (IoC) 的技术。 .NET 中的依赖关系注入是框架的内置局部。内置的IOC容器通过nuget增加援用 Microsoft.Extensions.DependencyInjection Microsoft.Extensions.DependencyInjection.Abstractionsinternal class Program{ private static void Main(string[] args) { DbHelper dbHelper = new DbHelper(); dbHelper.DoConnect(); }}public class DbHelper{ private readonly Redis redis = new Redis(); public void DoConnect() { redis.Connect(); }}public class Redis{ public void Connect() { Console.WriteLine($"HashCode:{this.GetHashCode()}Redis.....Connect"); }}在下面代码中,类DbHelper创立并间接依赖于Redis类。 硬编码的依赖项会产生问题,应防止应用,起因如下: ...

August 29, 2022 · 2 min · jiezi

关于asp.net-core:NET-7-预览版2-中的-ASPNET-Core-更新

.NET 7 预览版2 现已推出,其中包含对ASP.NET Core 的许多重大改良。 以下是此预览版中新增内容的摘要: 推断来自服务的API 控制器操作参数SignalR 集线器办法的依赖注入为minimal API 提供端点形容和摘要在最小的API 中绑定来自标头和查问字符串的数组和StringValue自定义cookie 批准值无关为.NET 7 打算的ASP.NET Core 工作的更多详细信息,请参阅GitHub 上的.NET 7 的残缺ASP.NET Core 路线图。 开始应用要开始应用.NET 7 Preview 2 中的ASP.NET Core,请装置.NET 7 SDK。 如果您在Windows 上应用Visual Studio,咱们倡议装置最新的Visual Studio 2022 预览版。Visual Studio for Mac 对.NET 7 预览的反对尚不可用,但行将推出。 要装置最新的.NET WebAssembly 构建工具,请从晋升的命令提示符处运行以下命令: dotnet workload install wasm-tools 降级现有我的项目要将现有的ASP.NET Core 利用从.NET 7 Preview 1 降级到.NET 7 Preview 2: 将所有Microsoft.AspNetCore. 包援用更新到7.0.0-preview.2.。将所有Microsoft.Extensions. 包援用更新到7.0.0-preview.2.。另请参阅.NET 7 的ASP.NET Core 中的重大更改的残缺列表。 推断来自服务的API 控制器操作参数当类型配置为服务时,API 控制器操作的参数绑定当初通过依赖注入绑定参数。 这意味着不再须要将[FromServices] 属性显式利用于参数。 ...

April 15, 2022 · 2 min · jiezi

关于asp.net-core:ASPNET-Core-6-的性能改进

受到 由Stephen Toub 公布的对于 .NET 性能的博客的启发,咱们正在写一篇相似的文章来强调ASP.NET Core 在6.0 中所做的性能改良。 基准设置咱们整个过程中大部分的实例应用的是BenchmarkDotNet。在https://github.com/BrennanConroy/BlogPost60Bench上提供了repo,其中包含本文中应用的大多数基准。 本文中的大多数基准测试后果都是通过以下命令行生成的: dotnet run -c Release -f net48 --runtimes net48 netcoreapp3.1 net5.0 net6.0 而后从列表中抉择要运行的特定基准。 这命令行给BenchmarkDotNet指令: 在公布配置中构建所有内容。针对 .NET Framework 4.8 外围区域构建它。在 .NET Framework 4.8、.NET Core 3.1、.NET 5 和 .NET 6 上运行每个基准测试。对于某些基准测试,它们仅在 .NET 6 上运行(例如,如果比拟同一版本上的编码的两种形式):dotnet run -c Release-f net6.0--runtimes net6.0对于其他人,只运行了版本的一个子集,例如dotnet run -c Release-f net5.0--runtimes net5.0 net6.0我将包含用于运行每个基准测试的命令。本文中的大多数后果都是在Windows上运行上述基准测试生成的,次要是为了将. NET Framework 4.8蕴含在后果集中。 然而,除非另有阐明,一般来说,所有这些基准测试在Linux或macOS上运行时都显示出相当显著的改良。只需确保您曾经装置了想要测量的每个运行时。这些基准测试应用的是.NET 6 RC1的构建,以及最新公布的.NET 5和.NET Core 3.1下载。 span< T > 自从在.NET 2.1中减少了Span< T >,之后的每一个版本咱们都转换了更多的代码以在外部和作为公共API的一部分应用Span来进步性能。这次公布也不例外。 ...

April 8, 2022 · 4 min · jiezi

关于asp.net-core:ASPNET-Core-6-的性能改进

受到 由Stephen Toub 公布的对于 .NET 性能的博客的启发,咱们正在写一篇相似的文章来强调ASP.NET Core 在6.0 中所做的性能改良。 基准设置咱们将在整个过程中大部分的实例应用BenchmarkDotNet。在https://github.com/BrennanCon...上提供了一个回购协定,其中包含本文中应用的大多数基准。 本文中的大多数基准测试后果都是通过以下命令行生成的: dotnet run -c Release -f net48 --runtimes net48 netcoreapp3.1 net5.0 net6.0而后从列表中抉择要运行的特定基准。这命令行给BenchmarkDotNet指令:• 在公布配置中构建所有内容。• 针对 .NET Framework 4.8 外围区域构建它。• 在 .NET Framework 4.8、.NET Core 3.1、.NET 5 和 .NET 6 上运行每个基准测试。• 对于某些基准测试,它们仅在 .NET 6 上运行(例如,如果比拟同一版本上的编码的两种形式): dotnet run -c Release -f net6.0 --runtimes net6.0对于其他人,只运行了版本的一个子集,例如 dotnet run -c Release -f net5.0 --runtimes net5.0 net6.0我将包含用于运行每个基准测试的命令。 本文中的大多数后果都是在Windows上运行上述基准测试生成的,次要是为了将. NET Framework 4.8蕴含在后果集中。 然而,除非另有阐明,一般来说,所有这些基准测试在Linux或macOS上运行时都显示出相当显著的改良。只需确保您曾经装置了想要测量的每个运行时。这些基准测试应用的是.NET 6 RC1的构建,以及最新公布的.NET 5和.NET Core 3.1下载。 ...

March 5, 2022 · 4 min · jiezi

关于asp.net-core:aspnet-core的api版本管理最佳实践

什么要须要api版本控制一开始,零碎有一个api为客户A服务,随着业务倒退,零碎进行了降级,这个api也须要调整。然而,我还须要它持续能反对客户A,所以须要引入版本来治理。多个版本的API,相互之间的行为是不雷同的。 在asp.net core中实现api 版本形式有哪些?基于申请参数基于URL基于申请头安装包微软提供了独立的包反对,通过命令行或者nuget包管理工具引入 Install-Package Microsoft.AspNetCore.Mvc.Versioning在启动类中启用api版本定义扩大办法,启用配置 public static class ApiVersioningExtensions { public static IServiceCollection AddApiVersioning(this IServiceCollection services) { services.AddApiVersioning(config => { // 指定默认版本 config.DefaultApiVersion = new Microsoft.AspNetCore.Mvc.ApiVersion(1, 0); // 如果客户端没有在申请中指定api版本,则应用默认版本 config.AssumeDefaultVersionWhenUnspecified = true; // 颁布api版本 config.ReportApiVersions = true; }); return services; } }最佳目录构造将不同版本的api放到不同的目录下,职责更加清晰 基于url的api版本如何实现在url中明确晓得申请版本,我集体比拟喜爱这种 https://xxxx/api/v1/user https://xxxx/api/v2/user 1.0的api定义 namespace ApiVersioning.Controllers.V1{ [Route("api/v{version:apiVersion}/[controller]")] [ApiController] [ApiVersion("1.0")] public class UserController : ControllerBase { [HttpGet] public string Get() { return "use from api v1"; } }}2.0的api定义 ...

August 5, 2021 · 1 min · jiezi

关于asp.net-core:云原生ASPNET-Core程序的可监测性和可观察性

分布式应用程序很简单,给开发人员调试和修复生产问题带来了一系列挑战。只管微服务架构可帮忙维持一支规模较小,能够自主工作并专一于独立业务团队,但因为其分布式性质,它带来了新的挑战。例如,在业务交易过程中呈现问题的状况下,须要端到端跟踪申请,该申请可能逾越多个服务和基础架构。 解决问题时可能遇到的挑战有: 治理已知和未知故障故障也是分布式的传统监控零碎不实用这是可监测性和可察看性呈现的中央。可监测性记录应用程序的总体运行状况,而可察看性则能够帮忙您更深刻地理解上下文数据。在.NET大会上,我和Cecil 曾经深刻探讨了云原生应用程序中的可监测性和可察看性。 https://www.bilibili.com/vide... 以上视频中,咱们着眼于可察看性和可监测性的关键点,例如日志(Logging),掂量指标(Metrics),链路追踪(Tracing),并深入分析了运行状况查看(Health checks)。 以下是视频中探讨的一些基本概念: 运行状况查看(Health checks)微服务实现了运行状况查看,最现实的状况是应用HTTP endpoints,以便各种实时监控零碎能够查问状态。 运行状况查看端点至多应做出以下响应: 零碎正在运行吗?它能够执行工作吗?在Kubernetes世界中,这些别离间接转换为liveness和readiness。 它们定义在Kubernetes的YAML部署配置文件中。 liveness门路是Kubernetes定期查问以查看故障的端点。 Kubernetes提供了liveness探针来监测失败的应用程序,并在它们不返回胜利代码时重新启动它们。readiness门路是Kubernetes查问以理解服务何时就绪,能够开始承受流量的终端。 当所有注册的查看都胜利时,它将返回HTTP状态代码200。ASP.NET Core提供用于向可监测性零碎报告运行状况的中间件和库,来提供运行状况查看。 相干文档请查阅ASP.NET Core中的运行状况查看。 日志无论您应用什么工具考察生产环境中的问题,最终都会是以日志的模式反馈问题的根本原因。 在分布式环境中,您须要确保日志记录蕴含有助于调试的深刻信息。 能够从一个集中的中央查问它们。 每个日志记录都须要有一个关联ID,以便进行跟踪以理解全局。 结构化日志应用结构化日志,您能够将序列化的对象增加到日志中,日志监视系统能够高效地查问这些对象。 例如,您能够依据customerID或trasnsactionID查问整个事务日志。 在ASP.NET Core应用程序中,能够应用提供结构化日志记录的Serilog。请查阅.NET Core和ASP.NET Core中的日志入门,以及Serilog理解结构化日志。 集中式日志和关联ID在传统应用程序中,日志文件存储在本地计算机上。在分布式环境中,把日志记录在某一台计算机中的纯文本文件中是没有帮忙的。生成日志的应用程序可能无法访问本地磁盘,或者当容器在虚拟机中挪动时,本地磁盘可能是高度瞬态的。因为在Cloud-native应用程序中应用基于文件的日志会遇到一些问题,因而首选集中式日志。日志由应用程序收集并传送到一个集中的日志应用程序,该应用程序对日志进行索引和存储。这类零碎每天能够接管数十GB的日志。Serilog提供了向集中式零碎(如Azure Application Insights,Azure Monitor的一项性能)写入日志事件的接收器。在构建跨多个服务的日志记录时,遵循一些规范做法也很有帮忙。例如,在事务开始时生成一个关联ID,而后将其记录到与该事务相干的每条音讯中,这样能够更容易地从集中式日志零碎中搜寻所有相干音讯。 分布式跟踪 分布式跟踪等效于古代云和微服务体系结构的调用堆栈,并增加了性能分析器。分布式跟踪或分布式申请跟踪有助于端到端查看申请,并使您可能从整体上辨认问题。跟踪能够为您提供无关问题的具体答案,例如事件产生在什么时候?它花了多少工夫?为什么要花这么长时间?哪些微服务解决了它?等等,像openzipkin / zipkin之类的开源分布式跟踪零碎,在该畛域十分风行。 为您的应用程序启用分布式跟踪就跟将相应的分布式跟踪提供商的SDK增加到每个微服务中一样简略。例如,在您的利用中装置并配置了Application Insights SDK后,SDK依赖关系主动收集器会主动收集风行框架,库和技术的跟踪信息。 在几个不同的零碎和工具之间,须要有一套规范以便于察看。OpenTelemetry标准化了不同的应用程序和框架如何收集和收回可观测性遥测。OpenTelemetry提供了一个与供应商无关的标准、一组api、sdk和工具以及用于可观测性遥测(分布式跟踪、度量等)的集成。查看博客文章OpenTelemetry .net reachs v1.0以获取详细信息。 入手模块咱们曾经构建了一系列模块来帮忙您学习构建.NET微服务和云原生技术。 查看以下模块,这些模块将帮忙您理解可监测性和可察看性相干技术。 行运行状况查看:创立和部署.Net微服务和云原生技术可监测性和可察看性:测试cloud-native ASP.NET Core微服务无关其余主题,请查看https://aka.ms/aspnet-microse...

May 27, 2021 · 1 min · jiezi

关于asp.net-core:手把手教你AspNetCore-WebApi认证与授权

前言这几天小明又有懊恼了,之前给小红的接口没有做认证受权,间接裸奔在线上,被马老板发现后狠狠的骂了一顿,连忙让小明把受权加上。连忙Baidu一下,发现大家都在用JWT认证受权,这个倒是挺适宜本人的。 什么是TokenToken是服务端生成的一串字符串,以作客户端进行申请的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,当前客户端只需带上这个Token前来申请数据即可,无需再次带上用户名和明码。 什么是JWTJson web token (JWT),是为了在网络应用环境间传递申明而执行的一种基于JSON的凋谢规范((RFC 7519).该token被设计为紧凑且平安的,特地实用于分布式站点的单点登录(SSO)场景。JWT的申明个别被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也能够减少一些额定的其它业务逻辑所必须的申明信息,该token也可间接被用于认证,也可被加密。 JWT认证流程 从图中能够看出次要有两局部组成:1、获取Token,2、通过Token进行受权。 应用JWT认证首先,装置JwtBearer包。 dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer --version 3.1.0接下来,定义一个配置类,我这里为了简略间接用常量代替了,你也能够放在配置文件中。 public class TokenParameter{ public const string Issuer = "深度码农";//颁发者 public const string Audience = "深度码农";//接收者 public const string Secret = "1234567812345678";//签名秘钥 public const int AccessExpiration = 30;//AccessToken过期工夫(分钟)}接下来,定义一个通过用户名和明码,获取Token的控制器。 [Route("api/oauth")][ApiController]public class OAuthController : ControllerBase{ /// <summary> /// 获取Token /// </summary> /// <returns></returns> [HttpGet] [Route("token")] public ActionResult GetAccessToken(string username, string password) { //这儿在做用户的帐号密码校验。我这儿略过了。 if (username != "admin" || password != "admin") return BadRequest("Invalid Request"); var claims = new[] { new Claim(ClaimTypes.Name, username), new Claim(ClaimTypes.Role, ""), }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(TokenParameter.Secret)); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var jwtToken = new JwtSecurityToken(TokenParameter.Issuer, TokenParameter.Audience, claims, expires: DateTime.UtcNow.AddMinutes(TokenParameter.AccessExpiration), signingCredentials: credentials); var token = new JwtSecurityTokenHandler().WriteToken(jwtToken); return Ok(token); }}接下来,增加Token身份认证到容器(Startup.ConfigureServices)。 ...

October 11, 2020 · 1 min · jiezi

关于asp.net-core:手把手教你AspNetCore-WebApi增删改查

前言小明曾经创立与运行了WebApi我的项目,理解我的项目构造有哪些组成,并学会了怎么公布到IIS。根底曾经建好,从当初开始要真正实现待办事项的性能了。 新建表CREATE TABLE [dbo].[Todo]( [Id] [uniqueidentifier] NOT NULL, [Name] [nvarchar](100) NULL, CONSTRAINT [PK_Todo] PRIMARY KEY CLUSTERED ( [Id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GO 增加模型类在“解决方案资源管理器”中,右键单击我的项目。 抉择“增加” > “新建文件夹”。 将文件夹命名为 Models。右键单击 Models 文件夹,而后抉择“增加” > “类” 。 将类命名为 Todo,而后抉择“增加”。using System;namespace App001.Models{ public class Todo { public Guid Id { get; set; } public string Name { get; set; } }}增加数据库上下文右键单击 Models 文件夹,而后抉择“增加” > “类” 。 将类命名为 TodoContext,而后单击“增加”。using Microsoft.EntityFrameworkCore;namespace App001.Models{ public class TodoContext : DbContext { public TodoContext(DbContextOptions<TodoContext> options) : base(options) { } public DbSet<Todo> Todos { get; set; } }}注册数据库上下文在 ASP.NET Core 中,服务(如数据库上下文)必须向依赖关系注入 (DI) 容器进行注册。 该容器向控制器提供服务。 ...

October 10, 2020 · 2 min · jiezi

关于asp.net-core:手把手教你AspNetCore-WebApi入门

需要前几天,马老板给小明和小红一个“待办事项”网站,小明负责后端,小红负责前端,并要求网站能够同时在 Windows、和 Linux 上运行。 小明整顿了一下“待办事项”的性能清单: 获取所有待办事项按 ID 获取项增加新项更新现有项删除项创立 Web 我的项目从“文件”菜单中选择“新建”>“我的项目” 。抉择“ASP.NET Core Web 应用程序”模板,再单击“下一步” 。将我的项目命名为 App001,而后单击“创立”。在“创立新的 ASP.NET Core Web 应用程序”对话框中,确认抉择“.NET Core”和“ASP.NET Core 3.1” 。 抉择“API”模板,而后单击“创立” 。 测试 API按 Ctrl+F5 运行利用。 Visual Studio 启动浏览器并导航到 https://localhost:<port>/WeatherForecast,其中 <port> 是随机抉择的端口号。 到目前为止,小明曾经胜利创立并运行了一个WebApi我的项目。 我的项目构造 从这个图中能够看出WebApi我的项目次要由Program.cs,Startup.cs,appsettings.json,WeatherForecastController.cs文件组成,那么当初咱们一个一个介绍一下这几个文件次要由什么作用。 Program类它是所有.net core程序的入口,定义了2个办法:Main() 和CreateHostBuilder(); public class Program{ public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });}代码不简单,创立泛型主机并运行。 ...

October 10, 2020 · 1 min · jiezi