gpt4 book ai didi

c# - 如何在 .NET Core DI 中强制创建类的实例?

转载 作者:行者123 更新时间:2023-12-04 01:51:49 24 4
gpt4 key购买 nike

我有以下代码:

public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();

services.Configure<MyConfig>(Configuration.GetSection("MySection"));
services.AddSingleton<IMyClass>(sp => new MyClass(sp.GetService<IOptions<MyConfig>>()));
}

这为 MyClass 注册了一个单例现在我可以让我的 Controller 采用 IMyClass 类型的构造函数参数.这按预期工作。
MyClass仅当 Controller 需要 IMyClass 时才首先实例化.但是,我想 MyClass待实例化 之前 任何人都曾要求过它(因为它在它的构造函数中做了一些工作,这需要一点时间)。

我可以做这样的事情:
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();

services.Configure<MyConfig>(configuration.GetSection("MySection"));

var myinstance = new MyClass(/*...*/); // How do I get MyConfig in here?
services.AddSingleton<IMyClass>(myinstance);
}

...但是我无法进入配置,因为我没有对 IServiceProvider 的引用(第一个代码示例中的 sp 变量)。我如何到达 sericeprovider 或者我必须做什么来确保实例尽快初始化?

最佳答案

在那种情况下,真的不需要 IOptions<T>因为您可以提取配置并将其直接传递给您的类,但是如果您坚持使用选项,则可以使用 OptionsWrapper<TOptions> Class

IOptions wrapper that returns the options instance.



并将其传递给您的实例
// How do I get MyConfig in here?
MyConfig myConfig = configuration.GetSection("MySection").Get<MyConfig>();
var wrapper = new OptionsWrapper<MyConfig>(myConfig);
var myinstance = new MyClass(wrapper);
services.AddSingleton<IMyClass>(myinstance);

从包装器的配置中提取您的设置。

引用 Configuration in ASP.NET Core: Bind to an object graph

关于c# - 如何在 .NET Core DI 中强制创建类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52612796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com