当前位置:首页 > Web开发 > 正文

制止在ASP.NET Core 3.0中为启动类注入处事

2024-03-31 Web开发

技术图片

本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇。

Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库

Part 2 - IHostingEnvironment VS IHostEnvironent - .NET Core 3.0中的废弃类型

Part 3 - 制止在ASP.NET Core 3.0中为启动类注入处事(本篇)

Part 4 - 将终端中间件转换为ASP.NET Core 3.0中的端点路由

Part 5 - 将集成测试的转换为NET Core 3.0

在本篇博客中,我将描述从ASP.NET Core 2.x应用升级到.NET Core 3.0需要做的一个改削:你不在需要在Startup结构函数中注入处事了。

在ASP.NET Core 3.0中迁移到通用主机

在.NET Core 3.0中, ASP.NET Core 3.0的托管根本已经被从头设计为通用主机,而不再与之并行使用。那么这对付那些正在使用ASP.NET Core 2.x开发应用的开发人员,,这意味着什么呢?在目前这个阶段,我已经迁移了多个应用,到目前为止,一切都进展顺利。官方的迁移指导文档可以很好的指导你完成所需的法式,因此,我强烈建议你读一下这篇文档。

在迁移过程中,我遇到的最多两个问题是:

ASP.NET Core 3.0中配置中间件的保举方法是使用端点路由(Endpoint Routing)。

通用主机不允许为Startup类注入处事

此中第一点,我之前已经讲解过了。端点路由(Endpoint Routing)是在ASP.NET Core 2.2中引入的,但是被限制只能在MVC中使用。在ASP.NET Core 3.0中,端点路由已经是保举的终端中间件实现了,因为它供给了很多好处。此中最重要的是,它允许中间件获取哪一个端点最终会被执行,并且可以检索有关这个端点的元数据(metadata)。例如,你可以为健康查抄端点应用授权。

端点路由是在配置中间件挨次时需要出格注意。我建议你再升级你的应用前,先阅读一下针对此处的说明,后续我将写一篇博客来介绍如何将终端中间件转换为端点路由。

第二点,是已经提到了的将处事注入Startup类,但是并没有得到足够的宣传。我不太确定是不是因为这样做的人不久不多,还是在一些场景下,它很容易解决。在本篇中,我将展示一些问题场景,并供给一些解决方案。

ASP.NET Core 2.x启动类中注入处事

在ASP.NET Core 2.x版本中,有一个鲜为人知的特性,就是你可以在Program.cs文件中配置你的依赖注入容器。以前我曾经使用这种方法来进行强类型选项,然后在配置依赖注入容器的其余残剩部分时使用这些配置。

下面我们来看一下ASP.NET Core 2.x的例子:

public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .ConfigureSettings(); // 配置处事,后续将在Startup中使用 }

这里有没有注意到在CreateWebHostBuilder中挪用了一个ConfigureSettings()的要领?这是一个我用来配置应用强类型选项的扩展要领。例如,这个扩展要领可能看起来是这样的:

public static class SettingsinstallerExtensions { public static IWebHostBuilder ConfigureSettings(this IWebHostBuilder builder) { return builder.ConfigureServices((context, services) => { var config = context.Configuration; services.Configure<ConnectionStrings>(config.GetSection("ConnectionStrings")); services.AddSingleton<ConnectionStrings>( ctx => ctx.GetService<IOptions<ConnectionStrings>>().Value) }); } }

所以这里,ConfigureSettings()要领挪用了IWebHostBuilder实例的ConfigureServices()要领,配置了一些设置。由于这些处事会在Startup初始化之前被配置到依赖注入容器,所以在Startup类的结构函数中,这些以配置的处事是可以被注入的。

public static class Startup { public class Startup { public Startup( IConfiguration configuration, ConnectionStrings ConnectionStrings) // 注入预配置处事 { Configuration = configuration; ConnectionStrings = ConnectionStrings; } public IConfiguration Configuration { get; } public ConnectionStrings ConnectionStrings { get; } public void ConfigureServices(IServiceCollection services) { services.AddControllers(); // 使用配置中的连接字符串 services.AddDbContext<BloggingContext>(options => options.UseSqlServer(ConnectionStrings.BloggingDatabase)); } public void Configure(IApplicationBuilder app) { } } }

我发明,当我先要在ConfigureServices要领中使用强类型选项东西配置其他处事时,这种模式非常的有用。在我上面的例子中,ConnectionStrings东西是一个强类型东西,并且这个东西在措施进入Startup之前,就已经进行非空验证。这并不是一种正规的根本技术,但是实时证明使用起来非常的顺手。

PS: 如何为ASP.NET Core的强类型选项东西添加验证

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31535.html