当前位置: 首页 > 知识库问答 >
问题:

ASP.NET配置DI后初始化单例

施宏大
2023-03-14

因此,假设我有一个在 DI 中注册的单例类实例,如下所示:

services.AddSingleton<IFoo, Foo>();

假设Foo类有许多其他依赖项(大多数是允许它加载数据的存储库类)。

按照我目前的理解,Foo实例直到第一次被使用(询问)时才被创建。除了构造函数之外,还有别的方法初始化这个类吗?就像在< code>ConfigureServices()完成之后?还是应该在Foo的构造函数中完成初始化代码(从db加载数据)?

(如果这个类可以在第一次使用之前加载其数据,以加快首次访问速度,那就太好了)

共有3个答案

容学林
2023-03-14

最近,如果需要初始化,我一直将其创建为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());
赖明煦
2023-03-14

我遇到了同样的问题,我找到了Andrew Lock的博客:https://andrewlock.net/running-async-tasks-on-app-startup-in-asp-net-core-3/

他解释了如何使用asp .net core 3执行此操作,但他也提到了有关如何在以前的版本中执行此操作的页面。

毋玺
2023-03-14

启动时自己动手。

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的和配置对象。 是否可以在这个阶段访问这些,以便正确设置我的依赖项?

  • 本文向大家介绍iOS 然后初始化,包括了iOS 然后初始化的使用技巧和注意事项,需要的朋友参考一下 示例 这在语法上类似于使用位置常量进行初始化的示例,但是需要Thenhttps://github.com/devxoul/Then的扩展名(如下所示)。 该Then扩展:            

  • 我正在努力学习Spring并理解它是如何工作的。我已经学习了一些设置Spring和Camel的教程,并使用默认设置进行了操作。 我现在正试图将尽可能多的配置XML文件转换为Java类。到目前为止,我已经成功地在Java类中创建了camel路由(扩展SpringRouteBuilder并实现configure()),以及spring配置文件(Bean)中的所有Bean- 这相当于什么样的非XML?