Как зарегистрировать IFileProvider для внедрения зависимостей в ядре asp.net 2.2? - PullRequest
1 голос
/ 05 октября 2019

У меня есть следующий класс, чтобы иметь возможность обслуживать файлы из ресурсов указанного проекта:

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 - тот, который теперь может обслуживать как физические, так и встроенные файлы.

Как зарегистрировать службу для IFileProvider?

Другими словами, как добраться до того IFileProvider, который остальная часть приложения использует при обслуживании статических файлов.

1 Ответ

0 голосов
/ 05 октября 2019

Я не смог найти никаких подсказок в Интернете о том, как решить эту проблему, хотя решение довольно простое и прямолинейное.

Я сделал функцию, которая разрешает StaticFileOptions, и появляются те опции, у которых уже есть готовыеиспользовать композитный провайдер файлов (в моем случае - провайдер как физических, так и встроенных файлов):

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

Debug output

А затем просто зарегистрируйте эту функцию для обслуживанияколлекция:

services.AddSingleton(GetFileProvider);
...