繁体   English   中英

如何在 asp.net core 2.2 中为依赖注入注册 IFileProvider?

[英]How to register IFileProvider for the dependency injection in asp.net core 2.2?

我有以下 class 以便能够从引用项目的资源中提供文件:

public class ConfigureOptions : IPostConfigureOptions<StaticFileOptions>
{
    private readonly IHostingEnvironment environment;

    public ConfigureOptions(IHostingEnvironment environment)
    {
        this.environment = environment;
    }

    public void PostConfigure(string name, StaticFileOptions options)
    {
        options.ContentTypeProvider = options.ContentTypeProvider ?? new FileExtensionContentTypeProvider();
        if (options.FileProvider == null && environment.WebRootFileProvider == null)
        {
            throw new InvalidOperationException("Missing FileProvider.");
        }
        options.FileProvider = options.FileProvider ?? environment.WebRootFileProvider;

        var filesProvider = new ManifestEmbeddedFileProvider(GetType().Assembly, "Resources");
        options.FileProvider = new CompositeFileProvider(options.FileProvider, filesProvider);
    }
}

然后将此设置包含在startup.cs中:

services.ConfigureOptions(typeof(Emails.ConfigureOptions));

现在,我有一个通过构造函数接收IFileProvider的服务:

public HtmlToEmailConverter(IFileProvider fileProvider)
{
    this.fileProvider = fileProvider ?? throw new ArgumentNullException(nameof(fileProvider));
}

当我尝试使用我的服务时出现 DI 错误:

尝试激活“...”时无法解析“Microsoft.Extensions.FileProviders.IFileProvider”类型的服务。

因此,我需要为IFileProvider注册服务,但想获得 asp.net 核心基础架构的 rest 正在使用的实例 - 现在可以同时提供物理文件和嵌入式文件的实例。

如何为IFileProvider注册服务?

换句话说,在提供 static 文件时,如何访问应用程序的 rest 正在使用的 IFileProvider。

尽管解决方案非常简单明了,但我在网上找不到任何有关如何解决此问题的线索。

我已经制作了解析StaticFileOptions的 function 并且这些选项似乎已经具有现成的复合文件提供程序(在我的情况下是物理和嵌入式文件提供程序):

private IFileProvider GetFileProvider(IServiceProvider serviceProvider)
{
    var staticFileOptions = serviceProvider.GetService<IOptions<StaticFileOptions>>();
    var staticFileProvider = staticFileOptions.Value.FileProvider;
    return staticFileProvider;
}

调试输出

然后只需将此 function 注册到服务集合:

services.AddSingleton(GetFileProvider);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM