Я хочу создать общий процесс запуска для всех моих 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 Базовое приложение для вызова метода ApplicationStartup в Program.cs: Main .
Однако, когда вызывается строка 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>();
});
Кто-нибудь может пролить свет на то, почему существует такое расхождение в поведении при запуске, пожалуйста?