繁体   English   中英

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

[英]How to force creation of instance of class in .NET Core DI?

我有以下代码:

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类型的构造函数参数。 这按预期工作。

仅当控制器需要IMyClass时才首先实例化MyClass 但是,我希望任何人提出要求之前先实例化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包装器。

并将其传递给您的实例

// 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);

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

ASP.NET Core中的参考配置:绑定到对象图

如果您的主要目标是在任何控制器需要它之前实例化该类,则可以在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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM