我正在构建一个在 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)));
});
编辑:不连贯的句子编辑添加了更多细节。