我有以下代码:
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<MyConfig>(Configuration.GetSection("MySection"));
services.AddSingleton<IMyClass>(sp => new MyClass(sp.GetService<IOptions<MyConfig>>()));
}
这为MyClass
注册了一个单例,现在我可以让我的控制器采用IMyClass
类型的构造函数参数。这按预期工作。
仅在控制器需要MyClass
时才首先实例化IMyClass
。但是,我希望在{strong>之前实例化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或必须做些什么才能确保实例尽快初始化?
答案 0 :(得分:3)
在那种情况下,确实不需要IOptions<T>
,因为您可以提取配置并将其直接传递给您的类,但是如果您坚持使用选项,则可以使用OptionsWrapper<TOptions> Class
< / p>
IOptions
包装器,返回选项实例。
并将其传递给您的实例
// 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);
从包装程序的配置中提取设置。
答案 1 :(得分:1)
如果您的主要目标是在任何控制器需要它之前实例化该类,则可以在Startup.cs的Configure方法中请求该类,这会使您的注册保持整洁,但确保将其初始化。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IMyClass myClass)
{
myClass.Initialize();
}
取决于为什么需要实例化它,如果您需要在应用程序启动时或类似性质的情况下连接到推送服务,则可能还需要检出IApplicationLifetime。
applicationLifetime.ApplicationStarted.Register(() => myConnection.Connect());
applicationLifetime.ApplicationStopping.Register(() => myConnection.Disconnect());