.NET Core внедряет одноэлементный сервис в другой одноэлементный сервис - PullRequest
0 голосов
/ 07 июня 2019

Я использую StackExchange.Redis для подключения к серверу Redis из .NET Core. Как я могу внедрить синглтон 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.

1 Ответ

2 голосов
/ 07 июня 2019

Вы можете использовать заводскую перегрузку делегата для 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, который может использоваться для разрешения желаемых услуг.

...