IDistributedCache доступен, но данных больше нет в кеше? - PullRequest
1 голос
/ 24 сентября 2019

Я использую services.AddDistributedMemoryCache() в своем классе .Net Core 3 web api startup.cs.Когда я впервые устанавливаю кеш:

public void SetCommandEventMappingCache(IServiceCollection serviceCollection)
{
    var cache = serviceCollection.BuildServiceProvider().GetService<IDistributedCache>();

    var mappingList = new List<CommandEventMapping>()
    {
        new CommandEventMapping()
        {
            ActionType = "add",
            GrowFlowCommand = new AddEmployee(),
            GrowFlowEvent = "EmployeeAdded",
            TraceabilityCommand = "employee_add"
        }
    };

    cache.Set<List<CommandEventMapping>>(
        "command_event_mappings", mappingList,new DistributedCacheEntryOptions()
    {
        AbsoluteExpiration = DateTimeOffset.Now.AddDays(1)
    });

    //I am able to get back the command_event_mappings here.
    //Once the IDistributedCache is injected. the data is lost
    var commandMapping = cache.Get<List<CommandEventMapping>>("command_event_mappings");
}

Во всех примерах, которые я видел, это обычно так.Разница лишь в том, что я добавил расширение для пар Set<T> и Get<T>.Я попробовал это без новых методов расширения и получил тот же результат.Фактический IDistributedCache, когда он вводится, доступен, но ранее кэшированные данные исчезли.Вот пример того, как я его впрыскиваю.

public LegacyCommandBus(IServiceProvider provider, IDistributedCache cache,
    ITraceabilityTenantService tenantService, IHttpClientFactory httpClientFactory)
    : base(provider)
{
    _provider = provider;
    _cache = cache;
    _tenantService = tenantService;
    _httpClientFactory = httpClientFactory; 
    //This is null
    _commandEventMappings = cache.Get<List<CommandEventMapping>>("command_event_mappings");
}

1 Ответ

3 голосов
/ 24 сентября 2019
var cache = serviceCollection.BuildServiceProvider().GetService<IDistributedCache>();

Каждый раз, когда вы звоните BuildServiceProvider(), вы генерируете новый контейнер со своим собственным набором синглетонов (отличным от тех, которые вводятся с помощью встроенного DI).

Решение состоит в том, чтобы решитьваш экземпляр IDistributedCache внутри Configure в вашем классе запуска.

public void Configure(IApplicationBuilder app, IDistributedCache cache) { 
    //...
}
...