.NET Core在另一个单例服务中注入单例服务

时间:2019-06-07 11:01:00

标签: c# asp.net-core dependency-injection redis stackexchange.redis

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

Startup.cs

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

MyService.cs

private DbContext _dbContext;
private IConnectionMultiplexer _redis;

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

我需要在???中代替ConfigureServices放置什么?还有其他方法吗?

StackExchange.Redis建议(link)我们保存ConnectionMultiplexer.Connect(...)调用的返回值并重复使用。因此,我为此创建了单例服务(它基于另一个StackOverFlow question),但是我并没有运气将其注入另一个SINGLETON服务MyService

1 个答案:

答案 0 :(得分:2)

注册服务时,您可以将工厂委托重载用于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,可用于解析所需的服务。