簡體   English   中英

抽象 .NET Core 3 應用程序啟動問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM