首页 > 解决方案 > 如何在注入前立即使用类?

问题描述

我在 sql 中有一些数据需要在 BuildWebHost 之前初始化。像这样

public static void PrepareToken(this IServiceCollection services)
{
    services.AddSingleton<IValidationToken, ValidationToken>();
    //need to use ValidationToken to init data immediately.

    //services.Add...  Other class
}

我可以写另一个类来做到这一点。但我想重用ValidationToken。我不能只新建 ValidationToken,因为 ValidationToken 构造函数是这样的:

private readonly ICacheManager _cacheManager;
private readonly IXXXXXRepository _XXXXXXXRepository;

private Dictionary<string, string> _validationToken = null;
private readonly object _lockObject = new object();

public ValidationToken(IXXXXXXXRepository XXXXXXXXRepository, ICacheManager cacheManager)
{
    _XXXXXXXRepository = XXXXXXXXRepository;
    _cacheManager = cacheManager;
}

任何人有任何模式或想法来解决这个问题?

标签: c#asp.net-coredependency-injection

解决方案


之后您无法立即执行此操作,services.Add~因为当时尚不存在任何服务。服务集合仅收集服务注册。只是稍后服务集合被构建到服务提供者中,此时您可以解析这些服务。

如果您需要初始化 this ValidationToken,那么您应该在其自己的构造函数中执行此操作。这样,您可以确保任何依赖于它的东西都将获得一个初始化的令牌。

或者,如果您需要验证令牌来初始化其他服务,那么您应该使这些服务正确地依赖于令牌,并让它们在各自的构造函数中初始化。


如果您需要在 Web 应用程序启动之前初始化某些内容,请构建 Web 主机之后但启动主机之前执行。所以你Program.Main可能看起来像这样:

public static void Main(string[] args)
{
    // create and build the host to make the DI container available
    var host = CreateHostBuilder(args).Build();

    // create a DI service scope in which the initialization can be done
    using (var scope = host.Services.CreateScope())
    {
        // retrieve service and initialize whatever
        var token = scope.ServiceProvider.GetService<ValidationToken>();
        token.Initialize();
    }

    // start the host which spins up e.g. the ASP.NET Core web application
    host.Run();
}

这使用 .NET Core 3.x 中的通用 HostBuilder。如果您仍在使用 WebHostBuilder,那么这看起来几乎相同;只需对返回的 WebHost 进行操作即可。


推荐阅读