首页 > 解决方案 > 在 ASP .NET Core 2.1 中注入配置值

问题描述

与其他人一样,我不同意将 IOptions 注入可能需要它的每个服务中,并寻找其他选项。我的目标是注入服务所需的值,仅此而已。我想出了以下内容,它可以工作且功能正常,但它是否可靠且可维护?似乎太简单和有效,就像我错过了一些东西。

要求:

我想出了以下内容。

public Startup(IConfiguration configuration)
{
     var configBuilder = new ConfigurationBuilder()
                  .SetBasePath(Directory.GetCurrentDirectory())
                  .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                  .AddJsonFile("myappsettings.json", optional: false, reloadOnChange: true)
                  .AddEnvironmentVariables()
                  ;
                Configuration = configBuilder.Build();
}

使用 LAMAR,因此如下:

public void ConfigureContainer(ServiceRegistry services)
{
    var config = new MyAppConfig();
    Configuration.GetSection("MyAppConfig").Bind(config);
}

我的 json 文件如下所示:

{
  "MyAppConfig": {
    "AppSettings": {
      "Name": "My Application"
    },
    "DataSettings": {
      "PrimaryDB": {
        "Name": "DBNAME",
        "ConnectionString": "Server=serverAddr.DOMAIN.com;Database=INITIAL_DB_HERE;User Id=MY_APP_USER_NAME;Password=******;MultipleActiveResultSets=true",
        "DatabaseName": "DBNAME",  // this has a separate use
        "Provider": ""
      }
    }
  }
}

要使用它,我只需将配置对象传递给创建服务实例的函数,并仅将需要的内容注入服务。

services.For<IPerformanceService>().Use(c => CreatePerformanceService(config));

private IPerformanceService CreatePerformanceService(IAppConfiguration appConfig)
{
    var myRepo = new PerformanceRepository(appConfig.DataSettings.PrimaryDB.ConnectionString, appConfig.DataSettings.PrimaryDB.DatabaseName);

    return new PerformanceService(myRepo);
}

标签: c#asp.net-coreasp.net-core-2.1configurationmanagerlamar

解决方案


我不认为这个有一个明确的答案,它更多的是关于你认为对你来说方便的东西。对于我自己,我采取了一种稍微不同的方法。

这是启动:

// Redis Caching
var redisConfiguration = configuration.GetSection("Redis").Get<RedisConfiguration>();
services.AddSingleton(redisConfiguration);
services.AddSingleton<RedisCacheHelper>();

那部分几乎就是你正在做的事情,一个保存配置值的类。请注意,您不需要“绑定”,您可以直接使用 .Get 将配置解析为一个类。

我将我的配置添加到单例中,因此我可以使用常规 DI 将其注入到构造函数中,无论我需要它。在这种情况下,它仅用于 CacheHelper 但我在其他地方使用了多个控制器和中间件的配置。

使用配置只是内部DI然后:

public class RedisCacheHelper
{
    public StackExchangeRedisCacheClient Cache {get;set;}

    public RedisCacheHelper(RedisConfiguration redisconfig)
    {
        Cache = new StackExchangeRedisCacheClient(new NewtonsoftSerializer(),redisconfig );
    }

}

推荐阅读