如何在.NET 6 上的程序文件中使用启动类?

ahm*_*ary 7 c# asp.net-core asp.net-core-6.0 .net-6.0

我正在开发 ASP.NET Core 2.2 Web 应用程序。将我的应用程序升级到 .NET 6 时遇到一些问题。

startup我的问题是.NET 6.0 中没有类,我program.cs只找到了文件。

我在我的网络应用程序上添加启动类,但我不知道如何在内部使用它Program.cs

如何startup在 my 中添加或使用类program.cs

这是startup.cs.NET Core 2.2 中的文件:

public class Startup
{
        private readonly IConfigurationRoot configRoot;
        private AppSettings AppSettings { get; set; }

        public Startup(IConfiguration configuration)
        {
            Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();
            Configuration = configuration;

            IConfigurationBuilder builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");
            configRoot = builder.Build();

            AppSettings = new AppSettings();
            Configuration.Bind(AppSettings);
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddController();
            services.AddDbContext(Configuration, configRoot);
            services.AddIdentityService(Configuration);

            services.AddAutoMapper();

            services.AddScopedServices();
            services.AddTransientServices();

            services.AddSwaggerOpenAPI();
            services.AddMailSetting(Configuration);
            services.AddServiceLayer();
            services.AddVersion();

            services.AddHealthCheck(AppSettings, Configuration);
            services.AddFeatureManagement();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory log)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseCors(options =>
                 options.WithOrigins("http://localhost:3000")
                 .AllowAnyHeader()
                 .AllowAnyMethod());

            app.ConfigureCustomExceptionMiddleware();

            log.AddSerilog();

            //app.ConfigureHealthCheck();

            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();
            app.ConfigureSwagger();

            app.UseHealthChecks("/healthz", new HealthCheckOptions
            {
                Predicate = _ => true,
                ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse,
                ResultStatusCodes =
                {
                    [HealthStatus.Healthy] = StatusCodes.Status200OK,
                    [HealthStatus.Degraded] = StatusCodes.Status500InternalServerError,
                    [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable,
                },
            }).UseHealthChecksUI(setup =>
              {
                  setup.ApiPath = "/healthcheck";
                  setup.UIPath = "/healthcheck-ui";
                  //setup.AddCustomStylesheet("Customization/custom.css");
              });

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 .NET 6 program.cs

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
Run Code Online (Sandbox Code Playgroud)

如何在类startup中使用类program.cs

更新后的帖子 一切正常,但配置服务不起作用,因为我不知道如何ILoggerFactory 实施startup

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory log)
        {
        }
Run Code Online (Sandbox Code Playgroud)

在program.cs上

startup.Configure(app, app.Environment,???);
Run Code Online (Sandbox Code Playgroud)

如何将记录器工厂添加为program.cs ILoggerFactory类中的 第三个参数更新它解决了使用

var app = builder.Build();
startup.Configure(
    app,
    builder.Environment,
    app.Services.GetRequiredService<FooService>(),
    app.Services.GetRequiredService<ILoggerFactory>()
);
Run Code Online (Sandbox Code Playgroud)

你能告诉我如何应用 swagger ui 来检查我的 api

Orw*_*wel 8

您可以手动实例化Startup并手动调用该方法ConfigureServicesConfigure

var builder = WebApplication.CreateBuilder(args);

var startup = new Startup(builder.Configuration);
startup.ConfigureServices(builder.Services);

var app = builder.Build();
startup.Configure(app, builder.Environment);
Run Code Online (Sandbox Code Playgroud)

在 ASP.NET Core 2.* 中,Startup.Configure接受注入服务:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddSingleton<IFooService, FooService>();
    }

    public void Configure(WebApplication app, IWebHostEnvironment env, IFooService fooService, ILoggerFactory loggerFactory)
    {

       fooService.Init();
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以 :

var app = builder.Build();
startup.Configure(
    app,
    builder.Environment,
    app.Services.GetRequiredService<FooService>(),
    app.Services.GetRequiredService<ILoggerFactory>()
);
Run Code Online (Sandbox Code Playgroud)

当我迁移 API 时,首先我考虑重用该类Startup...但最后我将配置移至扩展方法中。


Gur*_*ron 4

新模板使用所谓的最小托管模型,但没有人阻止切换回以前使用的通用托管模型(或通过WebHost)。

如果您想使用顶级语句,您可以将Main方法的内容复制到Program.cs文件中,然后复制旧Program类中声明的所有其他方法。新的Program.cs潜力可能看起来像这样:

await CreateHostBuilder(args)
    .Build()
    .RunAsync();

// do not forget to copy the rest of the setup if any
static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
Run Code Online (Sandbox Code Playgroud)

或者只是Startup完全删除该类并将配置方法移动到新文件的相应部分(也许提取一些简洁的扩展方法)。