c# - 将自定义 IFileProvider 添加到依赖于另一个 DI 服务的 RazorViewEngineOptions
问题描述
我想向 中添加一个自定义IFileProvider
,RazorViewEngineOptions
但是该自定义IFileProvider
需要另一个已在 dep-injection 系统中注册的服务。然而,in ConfigureServices
one 还不能访问这些服务(因为它还没有建成)。例如...
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 实例——但这似乎有点混乱。我猜配置回调是在服务构建之前/期间完成的,因此不能对服务集合本身进行引用?所以也许没有解决办法?
感谢您的任何帮助/见解。
解决方案
有了这个,你只需要相应地重构你的启动
//...
services
.AddOptions<RazorViewEngineOptions>()
.Configure<SomeService>((options, instanceOfSomeServiceSingleton) => { //<-- instance here
var myCustomFileProvider = new MyCustomFileProvider(instanceOfSomeServiceSingleton);
options.FileProviders.Add(myCustomFileProvider);
});
//...
推荐阅读
- react-native - proxy.invoke 在反应本机信号器中无法在连接开始时工作
- google-app-engine - 谷歌无服务器功能 - 它可以运行一个进程还是只运行一个程序?
- pine-script - 警报是否会配置为使用您的特定蜡烛类型运行?
- php - Wordpress 分页仅显示“下一个”和“上一个”按钮,但不显示页码
- php - 在 Gate 内使用 Databse 调用时出现 Laravel 错误
- html - 锚标记按钮不会更改字体颜色并且变量不起作用
- javascript - 写代码的时候把变量名和操作符分开有错吗?
- javascript - 带有 Kendo 的 Webpack - 我如何在里面使用 .kendoButton() 等