首页 > 解决方案 > .NET Core 在另一个单例服务中注入单例服务

问题描述

我正在使用StackExchange.Redis从 .NET Core 连接到 Redis 服务器。如何将单例注入IConnectionMultiplexer另一个单例服务?

启动.cs

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect(GetRedisConnectionString()));
    services.AddSingleton<IMyService>(new MyService(new DbContext(optionsBuilder.Options)), ???);
    ...
}

我的服务.cs

private DbContext _dbContext;
private IConnectionMultiplexer _redis;

public MyService(DbContext dbContext, IConnectionMultiplexer redis)
{
    _dbContext = fitDBContext;
    _redis = redis;
}

我需要放什么而不是???in ConfigureServices?还有其他方法吗?

StackExchange.Redis建议(链接)我们保存ConnectionMultiplexer.Connect(...)调用的返回值并重用它。因此,我为它创建了可以注入的单例服务(它基于另一个StackOverFlow 问题),但是我没有运气将它注入到另一个 SINGLETON 服务MyService中。

标签: c#asp.net-coredependency-injectionredisstackexchange.redis

解决方案


AddSingleton您可以在注册服务时使用工厂委托重载

public void ConfigureServices(IServiceCollection services) {

    //...

    services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect(GetRedisConnectionString()));
    services.AddSingleton<IMyService>(serviceProvider => 
        new MyService(new DbContext(optionsBuilder.Options), serviceProvider.GetRequiredService<IConnectionMultiplexer>())
    );

    //...
}

代理传入一个IServiceProvider可用于解析所需服务的参数。


推荐阅读