Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将服务注入到文件提供程序中_C#_.net Core_Fileprovider - Fatal编程技术网

C# 将服务注入到文件提供程序中

C# 将服务注入到文件提供程序中,c#,.net-core,fileprovider,C#,.net Core,Fileprovider,我正在构建一个自定义文件提供程序,它在AspNetCore 2中实现IFileProvider。文件提供者将接触Web服务(consumerBrandingRepository)以获取视图。webservice在启动时配置,并将缓存它接收的数据(通过IMemoryCache)。Web服务工作得完美无缺。 问题是,因为我在这里调用BuildServiceProvider来访问服务配置,所以我最终得到了一个MemoryCache,它为应用程序运行,另一个为文件提供程序运行。为了充分披露,Consum

我正在构建一个自定义文件提供程序,它在AspNetCore 2中实现IFileProvider。文件提供者将接触Web服务(consumerBrandingRepository)以获取视图。webservice在启动时配置,并将缓存它接收的数据(通过IMemoryCache)。Web服务工作得完美无缺。
问题是,因为我在这里调用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实例,它将我们指向服务提供商