【问题标题】:Injecting a service into a FileProvider将服务注入 FileProvider
【发布时间】:2019-10-16 16:56:58
【问题描述】:

我正在构建一个在 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)));
        });

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

【问题讨论】:

    标签: c# .net-core fileprovider


    【解决方案1】:

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

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

    然后,您可以在该块内您需要访问它的任何地方使用myCache

    我也认为serviceProvider.GetRequiredService&lt;IMemoryCache&gt;() 会起作用,但我不是 100% 确定。

    【讨论】:

    • 你不能这样做,MemoryCache 上没有默认构造函数。它想要一个 IOptions 的实例,它将我们指向服务提供者
    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2017-06-27
    • 1970-01-01
    • 2016-02-10
    相关资源
    最近更新 更多