[英]Abstracting .NET Core 3 Application Startup Issue
我想為我的所有 ASP.NET Core 3 項目創建一個通用的啟動過程,因此想將一個工作啟動例程抽象到 class 庫中以供重用。
因此,我創建了一個 .NET Core 3.1 Class 庫,並添加了編譯和可能運行所需的所有引用:
using Amazon.CertificateManager;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using NetCore3ApplicationBase;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using UtilityCore;
(UtilityCore 是一個內部庫)
我添加了一個“啟動類”:
namespace NetCoreApplicationBase
{
public static class ProgramBase
{
public static void ApplicationStartup(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
}
}
...並修改了示例 .NET Core 應用程序以調用 Program.cs:Main 中的 ApplicationStartup 方法。
但是,當調用 CreateHostBuilder 行時,出現異常:
The ConfigureServices method must either be parameterless or take only one parameter of type IServiceCollection
但是,僅當 CreatHostBuilder 代碼被抽象到另一個庫時才會發生此錯誤。 如果此代碼嵌入到應用程序中,它可以完美運行。
通過一些挖掘,這個錯誤最常與 EFCore 相關聯,這表明在啟動應用程序時(通過 aspnetcore.Hosting)正在搜索要使用的適當 DataContext。
但是在 HostBuilder 中使用:
services.AddDbContext<ApplicationDbContext>();
……沒什么區別。
* 更新 1 *
CreatHostBuilderMethod 如下所示:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService().ConfigureServices((hostContext, services) =>
{
services.AddHostedService<MyServiceName>();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseContentRoot(AppDomain.CurrentDomain.BaseDirectory);
webBuilder.UseStartup<Startup>();
});
* 更新 2 *
將 CreateHostBuilder 方法修改為僅接受服務會導致相同的錯誤消息。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService().ConfigureServices((services) =>
{
services.AddHostedService<MyServiceName>();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseContentRoot(AppDomain.CurrentDomain.BaseDirectory);
webBuilder.UseStartup<Startup>();
});
誰能解釋一下為什么啟動行為會出現這種差異?
感謝評論中的指示,我找出了問題所在。
webBuilder.UseStartup<Startup>();
指向一個 class,在那里我修改了 ConfigureServices 參數並添加了一些額外的參數,這意味着它不再匹配應用程序啟動所期望的委托。
哦!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.