所以,让我说我有一个单例类实例,我在DI中注册如下:
services.AddSingleton<IFoo, Foo>();
让我们说Foo
类有许多其他依赖项(主要是允许它加载数据的存储库类)。
根据我目前的理解,Foo实例在首次使用(询问)之前不会创建。有没有办法初始化除构造函数之外的这个类?就像ConfigureServices()
完成后一样?或者初始化代码(从db加载数据)是否应该在Foo的构造函数中完成?
(如果这个类可以在第一次使用之前加载其数据以加速第一次访问,那就太好了)
答案 0 :(得分:31)
在启动期间自己动手。
var foo = new Foo();
services.AddSingleton<IFoo>(foo);
或者&#34;热身&#34;
public void Configure(IApplicationBuilder app)
{
app.ApplicationServices.GetService<IFoo>();
}
或者
public void Configure(IApplicationBuilder app, IFoo foo)
{
...
}
但是如果你做了一些你不应该在构造函数中做的事情,那么这感觉很脏并且对你的设计来说更成问题。类实例化必须快速,如果你在其中进行长时间运行的操作,你就要打破一堆最佳实践,需要重构你的代码库,而不是寻找破解它的方法
答案 1 :(得分:4)
我遇到了同样的问题,并且找到了Andrew Lock博客: https://andrewlock.net/running-async-tasks-on-app-startup-in-asp-net-core-3/
他解释了如何使用asp .net core 3做到这一点,但他还参考了自己的页面,介绍了如何使用以前的版本。
答案 2 :(得分:0)
我做了一些经理,我需要订阅其他服务的事件。 我不喜欢在
中这样做webBuilder.Configure (applicationBuilder => ...
我认为应该在该部分
webBuilder.ConfigureServices ((context, services) => ...
所以,这是我的答案(在net.core 3上测试):
public static IHostBuilder CreateHostBuilder (string [] args) =>
Host.CreateDefaultBuilder (args)
.ConfigureWebHostDefaults (webBuilder =>
{
...
services.AddSingleton<ISomeSingletonService,SomeSingletonService>();
var buildServiceProvider = services.BuildServiceProvider();
var someSingletonService = buildServiceProvider.GetRequiredService <ISomeSingletonService>();
...
});