我注意到ASPNETCORE\u环境有一种奇怪的行为

  • 当我将其设置为Development时,由于某些服务的生命周期不正确(aka cannot consume scoped service...),我的应用程序会失败(应该如此)
  • 当我将其设置为Local时(我们使用Local进行本地开发;我们使用Development进行前端工作的开发环境),应用程序工作正常,没有抛出错误,范围服务由单例服务使用...

有没有办法在Local和其他环境中保持Development人的行为?问题是,我完全没有意识到我在推送无效代码(交叉判断数十个服务不是一件容易的任务-这就是为什么我假设它是由我的应用程序在本地完成的).

此外,我试图确定实现这额外Development个特定逻辑的线路,但没有成功.也许这里有人知道这个地方——我真的很想花点时间读一下代码.

我创建了一个最小的可复制示例:

程序反恐精英

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using WebApplication1;

var builder = Host.CreateDefaultBuilder(args)
    .ConfigureHostConfiguration(configHost =>
    {
    })
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>();
    });

builder.Build().Run();

启动.反恐精英

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using WebApplication1.Services;

namespace WebApplication1
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services
                .AddControllers();

            services
                .AddSingleton<单一服务>()
                .AddScoped<ScopedService>();
        }

        public void Configure(IApplicationBuilder app)
        {
            app
                .UseRouting();

            app.ApplicationServices
                .GetService<单一服务>()
                .DoSth();
        }
    }
}

单一服务

using System;

namespace WebApplication1.Services;

public class 单一服务
{
    private readonly ScopedService _scopedService;

    public 单一服务(ScopedService scopedService)
    {
        _scopedService = scopedService;
    }

    public void DoSth()
    {
        Console.WriteLine($"{nameof(单一服务)} - {nameof(DoSth)}");
        _scopedService.DoSth();
    }
}

ScopedService.恩

using System;

namespace WebApplication1.Services;

public class ScopedService
{
    public void DoSth()
    {
        Console.WriteLine($"{nameof(ScopedService)} - {nameof(DoSth)}");
    }
}

启动设置.jsone公司

{
  "profiles": {
    "WebApplication1": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": false,
      "applicationUrl": "http://localhost:8080",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

推荐答案

当您使用Host.CreateDefaultBuilder创建默认IHostBuilder时,当环境为"开发"时,它会将服务范围和建筑验证设置为true.以下是取自dotnet源代码的相关代码位:

internal static ServiceProviderOptions CreateDefaultServiceProviderOptions(HostBuilderContext context)
{
    bool isDevelopment = context.HostingEnvironment.IsDevelopment();
    return new ServiceProviderOptions
    {
        ValidateScopes = isDevelopment,
        ValidateOnBuild = isDevelopment,
    };
}

您可以在源代码中导航,以Host.CreateDefaultBuilder开头,以HostingHostBuilderExtensions.CreateDefaultServiceProviderOptions结尾.

Csharp相关问答推荐

将实例绑定方法传递到列表foreach

.NET通过版本自动增量设置包版本

C# Json重新初始化动态类型

如何打印已添加到List的Linq值,而不是C#中的:System.Collections.Generic.List ' 1[System.Int32]?

为什么使用DXGI输出复制和Direct 3D时捕获的图像数据全为零?

Microsoft. SQLServer. Types(106.1000.6)在try 从用户定义的类型检索值时引发异常

在. net毛伊岛窗口的深度链接已经创建""

使用客户端密钥为Fabric Rest API生成令牌

需要在重新启动ApplicartionPool或IIS后启动/唤醒API的帮助

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

try 使用C#ASP.NET收集WMI信息时访问被拒绝,但在PowerShell中工作

N层解决方案上的依赖注入-删除样板

具有以接口为其类型的属性的接口;类指定接口的实现,但无效

有没有更好的方法来在CosmosDB上插入非id?

类/值和日期的泛型方法

多个参数的最小API删除

项目参考和方法签名问题

在.Net 8 Visual Studio 2022中启用本机AOT发布时发布失败

无法将.Net Framework 4.8.1升级到.Net 7

无法创建&Quot;&Quot;类型的实例,因为无法将一个或多个参数绑定到