文章出處

這是一位朋友問我的問題,寫篇隨筆回答一下。有2種方法,一種叫丑陋的方法 —— IConfiguration ,一種叫優雅的方法 —— IOptions 。

1)先看丑陋的方法

比如在 RedisClient 中需要讀取 appsettings.json 中的 redis 連接字符串:

{
  "redis": {
    "ConnectionString": "xxx"
  }
}

需要在 RedisClient 的構造函數參數中添加 IConfiguration 接口,并通過它直接讀取:

public class RedisClient
{
    private readonly string _connectionString;

    public RedisClient(IConfiguration configuration)
    {
        _connectionString = configuration.GetSection("redis")["ConnectionString"];
    }
}

然后在 Startup 的 ConfigureServices() 方法中進行注入:

public IConfigurationRoot Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IConfiguration>(Configuration);     
}

2)接著看優雅的方法

首先定義一個存放連接字符串的配置類 RedisOptions :

public class RedisOptions
{
    public string ConnectionString { get; set; }
}

然后給 RedisClient 的構造函數參數中添加 IOptions<RedisOptions> 接口,通過 IOptions<RedisOptions> 讀取配置,RedisClient 無需關心 appsettings.json :

public class RedisClient
{
    private readonly RedisOptions _redisOptions;

    public RedisClient(IOptions<RedisOptions> redisOptions)
    {
        _redisOptions = redisOptions.Value;
    }
}

而 appsettings.json 中的配置可以在 Startup 的 ConfigureServices() 中注入進去:

services.AddOptions();
services.Configure<RedisOptions>(Configuration.GetSection("redis"));

(注:使用上面的 Configure 方法需要安裝 nuget 包 Microsoft.Extensions.Options.ConfigurationExtensions )

作為類庫的設計者,你可以更貼心些,寫個擴展方法進行上面的注入操作。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()