C# 将服务注入到文件提供程序中
我正在构建一个自定义文件提供程序,它在AspNetCore 2中实现IFileProvider。文件提供者将接触Web服务(consumerBrandingRepository)以获取视图。webservice在启动时配置,并将缓存它接收的数据(通过IMemoryCache)。Web服务工作得完美无缺。C# 将服务注入到文件提供程序中,c#,.net-core,fileprovider,C#,.net Core,Fileprovider,我正在构建一个自定义文件提供程序,它在AspNetCore 2中实现IFileProvider。文件提供者将接触Web服务(consumerBrandingRepository)以获取视图。webservice在启动时配置,并将缓存它接收的数据(通过IMemoryCache)。Web服务工作得完美无缺。 问题是,因为我在这里调用BuildServiceProvider来访问服务配置,所以我最终得到了一个MemoryCache,它为应用程序运行,另一个为文件提供程序运行。为了充分披露,Consum
问题是,因为我在这里调用BuildServiceProvider来访问服务配置,所以我最终得到了一个MemoryCache,它为应用程序运行,另一个为文件提供程序运行。为了充分披露,ConsumerBrandingRepository是对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)));
});
services.AddSingleton();
AddTransient(x=>new CachedAzureConsumerBrandingRepository(new AzureConsumerRepository(azureConfig),x.GetRequiredService());
配置(选项=>
{
var serviceProvider=services.BuildServiceProvider();
var logger=serviceProvider.GetRequiredService();
var consumerBrandingRepository=serviceProvider.GetRequiredService();
var clientKeyFactory=serviceProvider.GetRequiredService();
options.FileProviders.Clear();
options.FileProviders.Add(新的CompositeFileProvider)(
新设置文件提供程序(consumerBrandingRepository、logger、clientKeyFactory),
新的PhysicalFileProvider(_hostingEnvironment.ContentRootPath));
});
编辑:不连贯的句子
编辑添加了更多详细信息。如果您尝试这样的方法会怎么样
var myCache = new MemoryCache();
services.AddSingleton<IMemoryCache>(myCache);
var myCache=newmemorycache();
services.AddSingleton(myCache);
然后,您可以在该块中需要访问它的任何位置使用myCache
我还认为
serviceProvider.GetRequiredService()
可以工作,但我不是100%确定。你不能这样做,MemoryCache上没有默认的构造函数。它需要一个IOptions实例,它将我们指向服务提供商