【问题标题】:.NET Core inject singleton service in another singleton service.NET Core 在另一个单例服务中注入单例服务
【发布时间】:2019-10-22 21:17:50
【问题描述】:

我正在使用 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),但是我没有运气将它注入到另一个单例服务MyService

【问题讨论】:

  • 使用工厂委托
  • @Nkosi 你能举个例子吗?
  • 您将遇到将 dbcontext 作为IMyService 的单例的问题!请看这篇帖子stackoverflow.com/questions/48767910/…
  • @Mark alsami 在他们关于在单例中使用 DbContext 的观察中是正确的。那里有潜在的问题。您是否考虑过使您的服务范围化?并且还让服务容器管理上下文的生命周期
  • 技术上,只有IConnectionMultiplexer 需要是一个单例。 IMyService 不一定是。容器将保留实例。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 2019-06-21
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多