0

我正在构建一个在 AspNetCore 2 中实现 IFileProvider 的自定义文件提供程序。文件提供程序将与 web 服务( consumerBrandingRepository )联系以获取视图。Web 服务在 Startup 中配置,并将缓存它接收到的数据(通过 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)));
        });

编辑:不连贯的句子编辑添加了更多细节。

4

1 回答 1

0

如果你尝试这样的事情怎么办?

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

然后,您可以使用myCache该块内您需要访问它的任何位置。

我也认为这serviceProvider.GetRequiredService<IMemoryCache>()会奏效,但我不是 100% 确定。

于 2019-10-16T17:13:01.537 回答