簡體   English   中英

在 class 庫中獲取環境變量(.NET Core 控制台應用程序)

[英]Get environment variables in class library (.NET Core console app)

我有控制台應用程序,其中有控制台應用程序項目和 class 庫

我創建了 appSettings.json 文件,我在其中存儲所有數據。

在控制台應用程序中,我在Program.cs中創建此代碼以使用 envVariables

class Program
{
    public static IConfigurationRoot Configuration;
    private static ServiceThread _serviceThread;

    static async Task Main(string[] args)
    {
        MainAsync(args).Wait();
        // Run with console or service
        var asService = !(Debugger.IsAttached || args.Contains("--console"));

        var builder = new HostBuilder()
            .ConfigureServices((hostContext, services) => { services.AddHostedService<MonitoringService>(); });
        builder.UseEnvironment(asService ? EnvironmentName.Production : EnvironmentName.Development);

        if (asService)
        {
            await builder.RunAsServiceAsync();
        }
        else
        {
            _serviceThread = new ServiceThread();
            _serviceThread.Start("Started");
            await builder.RunConsoleAsync();
        }
    }

    static async Task MainAsync(string[] args)
    {
        // Create service collection

        var serviceCollection = new ServiceCollection();
        ConfigureServices(serviceCollection);

        // Create service provider

        IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();

        // Print connection string to demonstrate configuration object is populated
        Console.WriteLine(Configuration.GetConnectionString("DataConnection"));
    }

    private static void ConfigureServices(IServiceCollection serviceCollection)
    {
        // Build configuration
        Configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
            .AddJsonFile("appSettings.json", false)
            .Build();

        // Add access to generic IConfigurationRoot
        serviceCollection.AddSingleton<IConfigurationRoot>(Configuration);
    }
}

現在在 class 庫中,我想使用這些變量。

我這樣試過

public class HelpersAppService
{
    private readonly IConfigurationRoot _configuration;

        public HelpersAppService(IConfigurationRoot configuration)
        {
            _configuration = configuration;
        }

        public ServerUrlsDto GetServerUrls()
        {
            var serverUrls = _configuration.GetSection("ServerUrls").Get<ServerUrlsDto>();
            return serverUrls;
        }

        public AuthDto GetAuth()
        {
            var authData = _configuration.GetSection("Auth").Get<AuthDto>();
            return authData;
        }
    }

但是問題是,我在這個方法中有 null 配置。 我做錯了什么?

.NET 核心框架為您提供了許多有用的擴展。 我建議像這樣使用它們:

static async Task Main(string[] args)
{
    // Run with console or service
    var asService = !(Debugger.IsAttached || args.Contains("--console"));

    var builder = Host
        .CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) => config
            .SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
            .AddJsonFile("appSettings.json", false))
        .ConfigureServices((context, services) => services
            .AddSingleton<HelpersAppService>()
            .AddHostedService<MonitoringService>())
        .UseEnvironment(asService ? EnvironmentName.Production : EnvironmentName.Development);

    if (asService)
    {
        await builder.RunAsServiceAsync();
    }
    else
    {
        _serviceThread = new ServiceThread();
        _serviceThread.Start("Started");
        await builder.RunConsoleAsync();
    }
}

更新:

您還需要像這樣注入IConfiguration而不是IConfigurationRoot

private readonly IConfiguration _configuration;

public HelpersAppService(IConfiguration configuration)
{
    _configuration = configuration;
}

筆記:

您還需要在ConfigureServices方法中添加HelpersAppService以使其成為 DI 的一部分並使IConfiguration可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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