我正在构建一个自定义文件提供程序,用于在AspNetCore 2中实现IFileProvider。 文件提供者将联系 webservice( consumerBrandingRepository ( 来获取视图。 Web服务在启动中配置,并将缓存它接收的数据(通过IMemoryCache(。 网络服务完美运行。
问题是,因为我在这里调用 BuildServiceProvider 来访问服务配置,所以我最终得到了一个为应用程序运行的 MemoryCache,另一个为文件提供程序运行的 MemoryCache。 为了完全披露,消费者品牌存储库是 Azure 存储上的抽象,目的是使更改特定于客户的某些视图成为可能,而无需重新部署整个应用。
从服务内部访问服务的正确方法是什么。配置如下所示的块?
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)));
});
编辑:不连贯的句子 编辑 添加了更多详细信息。
如果你尝试这样的事情怎么办?
var myCache = new MemoryCache();
services.AddSingleton<IMemoryCache>(myCache);
然后,您可以在该块内需要访问它的任何位置使用myCache
。
我也认为serviceProvider.GetRequiredService<IMemoryCache>()
会起作用,但我不是 100% 确定。