【问题标题】:Get environment variables in class library (.NET Core console app)获取类库中的环境变量(.NET Core 控制台应用)
【发布时间】:2020-09-04 01:30:53
【问题描述】:

我有控制台应用程序,其中有控制台应用程序项目和类库

我创建了 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);
    }
}

现在我想在类库中使用这些变量。

我试过这样

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;
        }
    }

但问题是,我在此方法中有空配置。我做错了什么?

【问题讨论】:

  • 您正在创建一个全新的服务集合/提供者 outside 主机并将 IConfigurationRoot 添加到其中。然后,您的主机正在创建一个新主机(内部)。您没有展示您的类是如何被使用/注入的,而是尝试接受 IConfiguration,因为 Host Builder 确实将其添加到 its 集合
  • 如何使用已创建的集合类库,或读取文件? @pinkfloydx33
  • 你是如何实例化你的类库对象的?如果是通过 DI 则更改参数类型
  • 什么意思,我有一个类库方法,我需要从 appSettings.json 文件中获取值。服务集合在控制台应用程序中实例化。我的问题是如何在类库方法中获取它们? @pinkfloydx33

标签: c# .net .net-core


【解决方案1】:

.NET Core 框架为您提供了许多有用的扩展。我建议像这样使用它们:

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

【讨论】:

  • 好的,那么我如何在类库方法中从 appsetings 文件中获取值?
  • 现在我不能使用RunAsServiceAsync()RunConsoleAsync(),因为主机没有这些方法
  • @Eugene Sukh 好的,我更新了。如果要向其中注入依赖项,还需要将HelpersAppService 添加到IServiceCollection
  • 现在遇到这个错误'Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType:
  • @Eugene Sukh 对于该错误,无论缺少 ServiceType 是什么,您还需要将其添加到 ConfigureServices 方法中。我看不出缺少什么,你不包括那部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 2021-01-29
  • 2018-04-19
  • 1970-01-01
  • 2019-01-21
相关资源
最近更新 更多