首页 > 解决方案 > 将自定义 IFileProvider 添加到依赖于另一个 DI 服务的 RazorViewEngineOptions

问题描述

我想向 中添加一个自定义IFileProviderRazorViewEngineOptions但是该自定义IFileProvider需要另一个已在 dep-injection 系统中注册的服务。然而,in ConfigureServicesone 还不能访问这些服务(因为它还没有建成)。例如...

public void ConfigureServices(IServiceCollection services)
{
    // ... add a bunch of services ...

    services.AddSingleton<SomeService>(); // Note that SomeService depends further on other services.

    services.AddMvc();

    services.Configure<RazorViewEngineOptions>(options =>
    {
        var instanceOfSomeServiceSingleton = ???How???;

        var myCustomFileProvider = new MyCustomFileProvider(instanceOfSomeServiceSingleton);

        options.FileProviders.Add(myCustomFileProvider);
    });

    // ...
}

在上面的代码中,我不知道如何获取instanceOfSomeServiceSingleton。我可以这样做services.BuildServiceProvider().GetRequiredService<SomeService>(),但据我了解,这将构建一个完全独立的服务集合,而不是应用程序的其余部分将使用的服务集合——这似乎很糟糕。

我可以手动构建 SomeService(以及它所依赖的服务),然后手动将它们全部添加到服务集合中,这样我就可以在 ConfigureServices 中引用 SomeService 实例——但这似乎有点混乱。我猜配置回调是在服务构建之前/期间完成的,因此不能对服务集合本身进行引用?所以也许没有解决办法?

感谢您的任何帮助/见解。

标签: c#asp.net-mvcasp.net-coredependency-injection

解决方案


参考使用 DI 服务配置选项

有了这个,你只需要相应地重构你的启动

//...

services
    .AddOptions<RazorViewEngineOptions>()
    .Configure<SomeService>((options, instanceOfSomeServiceSingleton) => { //<-- instance here

        var myCustomFileProvider = new MyCustomFileProvider(instanceOfSomeServiceSingleton);

        options.FileProviders.Add(myCustomFileProvider);
    });

//...

推荐阅读