更改函数签名后ConfigureServices
为了异步(最初它只是一个无效的同步函数,并且应用程序工作得很好),我收到以下错误:
无法找到所需的服务。请致电添加所有必需的服务IServiceCollection.AddAuthorization
在呼叫内ConfigureServices(...)
在应用程序启动代码中。
下面是我的代码ConfigureServices
功能。
// This method gets called by the runtime. Use this method to add services to the container.
public async Task ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
// Create the necessary Cosmos DB infrastructure
await CreateDatabaseAsync();
await CreateContainerAsync();
}
ConfigureServices
在运行时自动调用。
您不能只更改签名,它需要无效才能被框架调用。
现在,当您将其更改为 Task 时,这意味着框架找不到它,因此根本不会调用它。
这里有一个与此相关的 GitHub 问题:https://github.com/dotnet/aspnetcore/issues/5897 https://github.com/dotnet/aspnetcore/issues/5897
虽然这相当棘手...
5.0 没有任何进展,不,我们不知道如何在不阻止或破坏更改的情况下做到这一点。可以在两个不重叠的阶段中运行过滤器。
根据您的评论更新:
如果你想在启动过程中异步运行一些东西,我通常会这样做:
我创建一个这样的界面:
public interface IStartupTask
{
Task Execute();
}
然后是这样的示例实现
public class CreateDatabaseStartupTask : IStartupTask
{
public async Task Execute()
{
// My logic here
// await CreateDatabaseAsync();
}
}
然后在我的Program.cs中
public static async Task Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
// Resolve the StartupTasks from the ServiceProvider
var startupTasks = host.Services.GetServices<IStartupTask>();
// Run the StartupTasks
foreach(var startupTask in startupTasks)
{
await startupTask.Execute();
}
await host.RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
还有我的创业公司
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IStartupTask, CreateDatabaseStartupTask>();
}
}
所以重要的是:
- 注册您的启动任务
- 搭建主机
- 解决启动任务
- 运行启动任务
- 启动主机
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)