抽象.NET Core 3应用程序启动问题



我想为我的所有ASP.NET Core 3项目创建一个通用的启动过程,因此我想将一个工作的启动例程抽象到类库中以供重用。

因此,我创建了一个.NET Core 3.1类库,并添加了编译和潜在运行所需的所有引用:

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>();   

指向一个类,在那里我修改了ConfigureServices参数并添加了一些额外的参数,这意味着它不再符合应用程序启动所期望的委托。

哦!

最新更新