Абстрагирование. NET Проблема запуска приложения Core 3 - PullRequest
0 голосов
/ 07 апреля 2020

Я хочу создать общий процесс запуска для всех моих 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>();                

        });

Кто-нибудь может пролить свет на то, почему существует такое расхождение в поведении при запуске, пожалуйста?

1 Ответ

0 голосов
/ 07 апреля 2020

Благодаря указателям в комментариях я выяснил, что было не так.

  webBuilder.UseStartup<Startup>();   

указывал на класс, в котором я изменил параметры ConfigureServices и добавил некоторые дополнительные, что означает, что нет больше соответствовал делегату, которого ожидал запуск приложения.

D'oh!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...