因此,假设我有一个在 DI 中注册的单例类实例,如下所示:
services.AddSingleton<IFoo, Foo>();
假设Foo
类有许多其他依赖项(大多数是允许它加载数据的存储库类)。
按照我目前的理解,Foo实例直到第一次被使用(询问)时才被创建。除了构造函数之外,还有别的方法初始化这个类吗?就像在< code>ConfigureServices()完成之后?还是应该在Foo的构造函数中完成初始化代码(从db加载数据)?
(如果这个类可以在第一次使用之前加载其数据,以加快首次访问速度,那就太好了)
最近,如果需要初始化,我一直将其创建为IHostedService
,因为在我看来,让服务本身而不是外部处理初始化似乎更符合逻辑。
您甚至可以使用< code>BackgroundService来代替< code>IHostedService,因为它非常相似,并且只需要实现< code>ExecuteAsync
以下是它们的文档< br > https://learn . Microsoft . com/en-us/aspnet/core/fundamentals/host/hosted-services
如何添加服务以便可以直接注入它的示例:
services
.AddHostedService<MyService>()
.AddSingleton<MyService>(x => x
.GetServices<IHostedService>()
.OfType<MyService>()
.First());
简单服务示例:
public class MyService : IHostedService
{
// This function will be called automatically when the host `starts`
public async Task StartAsync(CancellationToken cancellationToken)
{
// Do initialization logic
}
// This function will be called automatically when the host `stops`
public Task StopAsync(CancellationToken cancellationToken)
{
// Do cleanup if needed
return Task.CompletedTask;
}
}
我后来创建的一些扩展方法,因为我需要再次使用相同的模式
public static class HostedServiceExtensions
{
public static IServiceCollection AddHostedServiceAsService<T>(this IServiceCollection services) where T : class, IHostedService
=> services.AddHostedService<T>().AddSingleton(x => x.GetServices<IHostedService>().OfType<T>().First());
public static IServiceCollection AddHostedServiceAsService<T>(this IServiceCollection services, Func<IServiceProvider, T> factory) where T : class, IHostedService
=> services.AddHostedService(factory).AddSingleton(x => x.GetServices<IHostedService>().OfType<T>().First());
}
使用方式
services.AddHostedServiceAsService<MyService>();
// Or like this if you need a factory
services.AddHostedServiceAsService<MyService>(x => new MyService());
我遇到了同样的问题,我找到了Andrew Lock的博客:https://andrewlock.net/running-async-tasks-on-app-startup-in-asp-net-core-3/
他解释了如何使用asp .net core 3执行此操作,但他也提到了有关如何在以前的版本中执行此操作的页面。
启动时自己动手。
var foo = new Foo();
services.AddSingleton<IFoo>(foo);
或者“热身”
public void Configure(IApplicationBuilder app)
{
app.ApplicationServices.GetService<IFoo>();
}
或者作为选择
public void Configure(IApplicationBuilder app, IFoo foo)
{
...
}
但是如果你在构造函数中做了一些不应该做的事情,这感觉很肮脏,而且对你的设计来说更是一个问题。类实例化必须快速,如果你在里面做长时间运行的操作,你会违背一堆最佳实践,需要重构你的代码库,而不是寻找绕过它的方法
我正在为DI与Dagger2的项目工作。我正在MVP架构中注入presenter。由于某种原因,当我构建应用程序时,它会出现错误:“LateInit property presenter has not been initialized”。我知道这意味着没有注射,但我不明白为什么。下面是我的代码: 应用程序类 家庭模块 AppComponent 房屋结构 如果需要任何关于代码的其他信息,请询问..
问题内容: 我是Visual Studio的新手。我目前正在创建一个登录表单。 我有这个代码。 但是,每当我尝试输入用户名和密码时,都会出现一个错误,提示“ 配置系统初始化失败” 。我只是想知道这是什么问题,我该如何解决? 请帮忙。 问题答案: 确保项目中的配置文件(如果是web则为web.config,如果是Windows则为app.config)以以下方式启动: 请注意,在元素内部,第一个孩子
我试图为Dropwizard创建一个调度作业,该作业每分钟运行一次,并查询数据库中的值。 为此,我需要在< code>initialize()阶段注册一些Dao和一个服务,如下所示: JDBI需要Dropw的和配置对象。 是否可以在这个阶段访问这些,以便正确设置我的依赖项?
我正在努力学习Spring并理解它是如何工作的。我已经学习了一些设置Spring和Camel的教程,并使用默认设置进行了操作。 我现在正试图将尽可能多的配置XML文件转换为Java类。到目前为止,我已经成功地在Java类中创建了camel路由(扩展SpringRouteBuilder并实现configure()),以及spring配置文件(Bean)中的所有Bean- 这相当于什么样的非XML?
本文介绍如何对 Kubernetes 上的集群进行初始化配置完成初始化账号和密码设置,以及批量自动执行 SQL 语句对数据库进行初始化。 注意: 如果 TiDB 集群创建完以后手动修改过 root 用户的密码,初始化会失败。 以下功能只在 TiDB 集群创建后第一次执行起作用,执行完以后再修改不会生效。 配置 TidbInitializer 请参考 TidbInitializer 示例和 API