如何创建 IHostBuilder 扩展?

时间:2021-05-18 08:52:25

标签: c# asp.net-core

我需要在早期访问 appsettings.json,所以我为 IHostBuilder 创建了一个扩展方法:

public static class MyClass1 
{
    public static bool property1
    public static string property2;

    public static IHostBuilder UseMyService(this IHostBuilder builder, Action<HostBuilderContext> context)
    {
        //Here what?

        return builder;
    }

    public static MyServiceClass MyService => new MyServiceClass(property1, property2);
}

Program.cs 中,我做到了:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) =>
        {
            var builder = config.Build();
            var env = context.HostingEnvironment;

            config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables();

        })
        .UseMyService((context) => 
        {
            //Here what?        
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

我需要从配置中设置属性 property1property2(我知道怎么做)。

但是我需要在 UseMyService 扩展方法中设置它们(我那里只有一个 Action)还是在 CreateHostBuilder 中?

1 个答案:

答案 0 :(得分:0)

你的问题很清楚,你没有在评论中回答我们的问题也无济于事,所以猜你想要什么,这是你可以做的:

public static class Hosting
{
    public static bool _property1;
    public static string _property2;
    public static IHostBuilder UseMyService(this IHostBuilder builder)
    {
        return builder.ConfigureServices((context, _) =>
        {
            _property1 = context.Configuration["Property1"].ToLower() == "true";
            _property2 = context.Configuration["Property2"];
        });
    }
}

如您所见,您可以通过 HostBuilderContext 访问配置,该配置可以通过 Microsoft.Extensions.Hosting.Abstractions 中的某些扩展访问。

请注意,不需要您在代码中显示的整个 ConfigureAppConfiguration 部分:CreateDefaultBuilder 已经为您完成了所有这些事情(以及更多)。报价

<块引用>

以下默认值应用于返回的 HostBuilder:

  • 将 ContentRootPath 设置为 GetCurrentDirectory() 的结果
  • 从带有“DOTNET_”前缀的环境变量加载主机 IConfiguration
  • 从“appsettings.json”和“appsettings.[EnvironmentName].json”加载应用 IConfiguration
  • 当 EnvironmentName 为“Development”时,使用入口程序集从 User Secrets 加载应用程序 IConfiguration
  • 从环境变量加载应用 IConfiguration
  • 配置 ILoggerFactory 以登录到控制台、调试和事件源输出
  • 当 EnvironmentName 为“Development”时,对依赖项注入容器启用范围验证

(编辑,您也可以使用 ConfigurationBinder 方法,例如 GetValue<bool> 等)