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

4

我正在使用 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建议(链接)我们保存ConnectionMultiplexer.Connect(...)调用的返回值并重复使用它。因此,我为此创建了一个单例服务(它基于另一个StackOverFlow问题),可以进行注入,但我注入到另一个SINGLETON服务MyService时没有成功。

使用工厂委托 - Nkosi
@Nkosi 你能提供一个例子吗? - Sam Carlson
2
DbContext作为IMyService的单例会遇到问题!请参考此帖子https://dev59.com/yVYM5IYBdhLWcg3wfQMa#48783504 - alsami
@Mark alsami在使用DbContext单例时的观察是正确的。那里有潜在的问题。您是否考虑将服务范围限定?并让服务容器管理上下文的生命周期。 - Nkosi
这可能是一个XY问题 - Nkosi
1
从技术上讲,只有 IConnectionMultiplexer 需要是单例的。IMyService 不需要是单例的。容器将会持有该实例。 - Nkosi
1个回答

9

您可以在注册服务时使用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,它可用于解析所需的服务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接