IDatabase 的 StackExchange.Redis 依赖注入?

sur*_*ret 8 c# stackexchange.redis .net-5

所以根据 StackExchange.Redis 文档,我要重新使用IConnectionMultiplexer

services.AddSingleton<IConnectionMultiplexer>(
        ConnectionMultiplexer
              .Connect($"{configsOptions.RedisUrl},password={secretsOptions.RedisPassword}"));

Run Code Online (Sandbox Code Playgroud)

但后来我发现在我的 redis 服务方法中,我必须注入 IConnectionMultiplexer 然后连接到数据库,如下所示:

public Task GetSomethingFromRedis(string key)
{
    IDatabase db = connectionMultiplexer.GetDatabase();
    string value = db.StringGet(key);
}
Run Code Online (Sandbox Code Playgroud)

不用connectionMultiplexer.GetDatabase()每次都调用,我可以像这样注入对象的单例吗?IDatabase或者这真的是一个坏主意吗?

services.AddSingleton<IDatabase>(cfg =>
   {
         var redisConnection = 
         ConnectionMultiplexer
            .Connect($"{configsOptions.RedisUrl},password={secretsOptions.RedisPassword}");

         return redisConnection.GetDatabase();
   });
Run Code Online (Sandbox Code Playgroud)

sur*_*ret 7

我最终做了这个

services.AddScoped<IDatabase>(cfg =>
     {
         IConnectionMultiplexer multiplexer = ConnectionMultiplexer.Connect($"{configsOptions.RedisUrl},password={secretsOptions.RedisPassword}");
         return multiplexer.GetDatabase();
     });
Run Code Online (Sandbox Code Playgroud)

然后为我服务:

private readonly IDatabase cache;

public RedisService(IDatabase cache)
{
   this.cache = cache;
}
Run Code Online (Sandbox Code Playgroud)

  • 这行得通,句号。但文档指出_从 GetDatabase 返回的对象是一个廉价的传递对象,不需要存储。_这意味着您可以使用“AddScoped&lt;IConnectionMultiplexer&gt;”并简单地返回创建的“ConnectionMultiplexer”。也许根据这些文档将其实例化为单例会更好:“因为 ConnectionMultiplexer 做了很多事情,所以它被设计为在调用者之间共享和重用。” 您不应该为每个操作创建一个 ConnectionMultiplexer。来源:https://stackexchange.github.io/StackExchange.Redis/Basics (5认同)