Внедрение службы в FileProvider - PullRequest
0 голосов
/ 16 октября 2019

Я создаю собственный провайдер файлов, который реализует IFileProvider в AspNetCore 2. Поставщик файлов обратится к веб-сервису (consumerBrandingRepository), чтобы получить представления. Веб-сервис настроен при запуске и будет кэшировать данные (через IMemoryCache), которые он получает. Веб-сервис работает безупречно.
Проблема в том, что, поскольку я вызываю BuildServiceProvider, чтобы получить доступ к конфигурации службы, я заканчиваю с MemoryCache, который работает для приложения, и еще одним, который работает для провайдеров файлов. Для полного раскрытия ConsumerBrandingRepository представляет собой абстракцию над хранилищем Azure, и его цель - сделать возможным изменение некоторых представлений, относящихся к клиенту, без повторного развертывания всего приложения.

Какой правильный способ получить доступ к службамизнутри services.Configure блок, показанный ниже?

        services.AddSingleton<IMemoryCache, MemoryCache>();
        services.AddTransient<IConsumerBrandingRepository>(x => new CachedAzureConsumerBrandingRepository(new AzureConsumerRepository(azureConfig), x.GetRequiredService<IMemoryCache>()));

        services.Configure<RazorViewEngineOptions>(options =>
        {
            var serviceProvider = services.BuildServiceProvider();
            var logger = serviceProvider.GetRequiredService<ILogger<SettingsFileProvider>>();
            var consumerBrandingRepository = serviceProvider.GetRequiredService<IConsumerBrandingRepository>();
            var clientKeyFactory = serviceProvider.GetRequiredService<IClientKeyFactory>();

            options.FileProviders.Clear();
            options.FileProviders.Add(new CompositeFileProvider(
                new SettingsFileProvider(consumerBrandingRepository, logger, clientKeyFactory),
                new PhysicalFileProvider(_hostingEnvironment.ContentRootPath)));
        });

Edit: несогласованное предложение Edit Добавлено больше деталей.

1 Ответ

0 голосов
/ 16 октября 2019

Что если вы попробовали что-то подобное?

var myCache = new MemoryCache();
services.AddSingleton<IMemoryCache>(myCache);

Тогда вы можете использовать myCache в любом месте внутри этого блока, к которому вам нужно получить доступ.

Я бы также подумал, что serviceProvider.GetRequiredService<IMemoryCache>() сработает, но я не уверен на 100%.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...