gpt4 book ai didi

c# - 如何在 .NET Core 控制台应用程序中设置 DI 容器?

转载 作者:行者123 更新时间:2023-12-04 01:09:44 24 4
gpt4 key购买 nike

我创建了一个新的 .NET Core 控制台应用程序并安装了以下包

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.EnvironmentVariables
  • Microsoft.Extensions.Configuration.Json
  • Microsoft.Extensions.DependencyInjection
  • Microsoft.Extensions.Options
  • Microsoft.Extensions.Options.ConfigurationExtensions

  • 我为配置创建了一个 appsettings.json 文件
    {
    "app": {
    "foo": "bar"
    }
    }
    我想将这些值映射到一个类
    internal class AppOptions
    {
    public string Foo { get; set; }
    }
    我还想在配置期间验证选项,所以我添加了一个验证类
    internal class AppOptionsValidator : IValidateOptions<AppOptions>
    {
    public ValidateOptionsResult Validate(string name, AppOptions options)
    {
    IList<string> validationFailures = new List<string>();

    if (string.IsNullOrEmpty(options.Foo))
    validationFailures.Add("Foo is required.");

    return validationFailures.Any()
    ? ValidateOptionsResult.Fail(validationFailures)
    : ValidateOptionsResult.Success;
    }
    }
    我想设置 DI 容器并创建一个测试场景
        static void Main(string[] args)
    {
    ConfigureServices();

    Console.ReadLine();
    }

    private static void ConfigureServices()
    {
    IServiceCollection serviceCollection = new ServiceCollection();
    IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();

    // Setup configuration service

    IConfiguration configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", true, true)
    .AddEnvironmentVariables()
    .Build();

    serviceCollection.AddSingleton(configuration);

    // Setup options

    IConfiguration configurationFromDI = serviceProvider.GetService<IConfiguration>(); // This is just for testing purposes

    IConfigurationSection myConfigurationSection = configurationFromDI.GetSection("app");

    serviceCollection.AddSingleton<IValidateOptions<AppOptions>, AppOptionsValidator>();
    serviceCollection.Configure<AppOptions>(myConfigurationSection);

    // Try to read the current options

    IOptions<AppOptions> appOptions = serviceProvider.GetService<IOptions<AppOptions>>();

    Console.WriteLine(appOptions.Value.Foo);
    }
    不幸的是变量 configurationFromDI一片空白。所以变量 configuration未添加到 DI 容器中。
    如何正确设置控制台应用程序的依赖注入(inject)?

    最佳答案

    调用 BuildServiceProvider应在所有服务都注册后进行。
    不过,没有必要编写所有这些代码。由于您已经使用了这么多扩展,因此最好(也更容易)使用 the generic Host ,与 ASP.NET Core 应用程序执行和使用其 ConfigureServices 的方式相同。 , ConfigureAppConfiguration方法:

    public class Program
    {
    public static void Main(string[] args)
    {
    CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureHostConfiguration(configuration =>
    {
    configuration....;
    });
    .ConfigureServices((hostContext, services) =>
    {
    var myConfigurationSection = configuration.GetSection("app");

    services.AddSingleton<IValidateOptions<AppOptions>, AppOptionsValidator>();
    services.Configure<AppOptions>(myConfigurationSection);

    });
    }
    可通过 HostBuilderContext.Configuration 进行配置属性(property)。
    CreateDefaultBuilder设置当前文件夹,配置环境变量和使用 appsettings.json文件,因此无需显式添加它们。
    Appsettings.json 复制设置
    在 Web 应用程序模板中, appsettings.json文件使用 Build Action 自动添加属性设置为 ContentCopy to OutputCopy if Newer 采取行动.
    控制台应用程序中没有此类文件。当一个新的 appsettings.json文件是手动添加的,它的 Build ActionNoneCopyNever .调试应用程序时,当前目录为 bin\Debug .使用默认设置, appsettings.json不会复制到 bin/Debug Build Action将不得不更改为 ContentCopy应设置为 Copy if NewerCopy Always .

    关于c# - 如何在 .NET Core 控制台应用程序中设置 DI 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65231269/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com