更改每个范围的默认命名选项

Chr*_*ris 6 c# dependency-injection .net-core

使用 .NET Core 的依赖注入Microsoft.Extensions.DependencyInjection,我想IOptions<>根据创建范围时(即运行时)可用的信息来更改传递给服务的信息,而不是基于我可以应用的任何配置在启动期间(据我所知)。

\n\n

例如,在 my 中Startup.cs,我配置了以下命名选项:

\n\n
services.Configure<SomeOptions>("red", config.GetSection("MyOptions:Red"));\nservices.Configure<SomeOptions>("blue", config.GetSection("MyOptions:Blue"));\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有一些代码创建了一个范围来完成一些工作:

\n\n
private readonly IServiceScopeFactory _serviceScopeFactory;\n\n// \xe2\x80\xa6\n\nusing (var scope = _serviceScopeFactory.CreateScope())\n{\n    // Some incoming request that should determine which colour to use.\n    var request = new { Colour = "red" };\n\n    var service = scope.ServiceProvider.GetRequiredService<SomeService>();\n\n    service.DoYourThing();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里SomeService使用类型的选项SomeOptions

\n\n
public SomeService(IOptions<SomeOptions> options)\n{\n    public void DoYourThing()\n    {\n        // \xe2\x80\xa6\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想将“红色”或“蓝色”选项传递给SomeService,而不是要求SomeService通过 查找选项的正确版本IOptionsSnapshot<T>.Get(string)。虽然我可以使用IOptionsSnapshot<SomeOptions>,但我不想在需要这些“颜色相关”设置的所有服务中执行此操作,我宁愿他们没有此责任,而且我不想乱扔垃圾我的代码具有这种重复的逻辑(加上处理缺失颜色等的重复逻辑)。

\n\n

理想情况下,在创建范围时,我希望能够说出哪个命名选项应该是该类型的默认选项。

\n\n

是否有一些我可以采用的服务或选项模式可以实现我在这里寻找的目标?

\n