配置DI

时间:2016-08-17 20:37:19

标签: dependency-injection singleton asp.net-core

所以,让我说我有一个单例类实例,我在DI中注册如下:

services.AddSingleton<IFoo, Foo>();

让我们说Foo类有许多其他依赖项(主要是允许它加载数据的存储库类)。

根据我目前的理解,Foo实例在首次使用(询问)之前不会创建。有没有办法初始化除构造函数之外的这个类?就像ConfigureServices()完成后一样?或者初始化代码(从db加载数据)是否应该在Foo的构造函数中完成?

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

3 个答案:

答案 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>();

        ...
        });