将IConfigurationSection转换为IOptions

时间:2018-11-06 05:27:32

标签: c# asp.net-core entity-framework-core asp.net-core-2.0

“选项”模式允许我创建包含配置值的选项对象,如此处所述:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-2.1

我需要IDesignTimeDbContextFactory实现中一个选项对象的值,以供EF在创建模型时使用。 (该配置部分中的值将用于数据播种,因此我在数据库上下文构造函数中添加了IOptions。)

由于我无权访问IServiceCollection(因为它是设计时间,就像运行“ dotnet ef migrations add”时一样),所以我需要有另一种方法将IConfigurationSection(代表我感兴趣的部分)转换为我的自定义选项课。

我可以知道如何在没有依赖注入的情况下做到这一点吗?

4 个答案:

答案 0 :(得分:5)

您可以使用Bind(Configuration, object)扩展方法对任何object进行手动绑定。这是一个示例:

var myCustomOptions = new MyCustomOptions();
myConfigurationSection.Bind(myCustomOptions);

// Use myCustomOptions directly.

要包装为IOptions<T>,可以使用Options.Create,如下所示:

IOptions<MyCustomOptions> myOptions = Options.Create(myCustomOptions);

答案 1 :(得分:0)

我想您需要Bind方法:

def sout = new StringBuilder()
def serr = new StringBuilder()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(30000)

答案 2 :(得分:0)

ServiceCollectionContainerBuilderExtensions 使其在SoapCore中起作用

我的应用程序中的部分是这样的:

            services.AddSingleton<IRESAdapterService>(new RESAdapterService(
                new XController(
                    services.BuildServiceProvider().GetRequiredService<IOptions<XApiSettingsFromJsonClass>>(),
                    _xLogger
                    )));

也可以在完整性单元测试中使用

答案 3 :(得分:0)

您也可以使用

config.Get<MyCustomOptions>()

这是Microsoft.Extensions.Configuration命名空间的扩展方法。我在Assembly Microsoft.Extensions.Configuration.Binder,版本= 3.1.9.0中看到了它。也许,它也存在于早期版本中。这将为您提供Settings对象本身。然后您可以将其包装到IOptions中,如Krik在另一个答案中所示。