簡體   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