Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在注入前立即使用类?_C#_Asp.net Core_Dependency Injection - Fatal编程技术网

C# 如何在注入前立即使用类?

C# 如何在注入前立即使用类?,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,我有一些sql数据需要在构建WebHost之前初始化。 像这样 public static void PrepareToken(this IServiceCollection services) { services.AddSingleton<IValidationToken, ValidationToken>(); //need to use ValidationToken to init data immediately. //services.Add.

我有一些sql数据需要在构建WebHost之前初始化。 像这样

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

    //services.Add...  Other class
}
public static void PrepareToken(此IServiceCollection服务)
{
services.AddSingleton();
//需要立即使用ValidationToken初始化数据。
//服务。添加…其他类
}
我可以写另一个类来做这件事。但我想重用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;
}
专用只读ICacheManager\u cacheManager;
专用只读IXXXXX存储库uxxxxxx存储库;
私有字典_validationToken=null;
私有只读对象_lockObject=新对象();
公共验证令牌(IXXXXXXX存储库XXXXXXXX存储库,ICacheManager cacheManager)
{
_XXXXXXXX存储库=XXXXXXXX存储库;
_cacheManager=cacheManager;
}

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

您不能在
服务之后立即这样做。添加~
,因为当时还没有任何服务存在。服务集合仅收集服务注册。直到稍后,服务集合才内置到服务提供者中,此时您可以解析这些服务

如果需要初始化此
验证令牌
,则应在其自己的构造函数中进行初始化。这样,您就可以确保依赖于它的任何东西都将获得初始化令牌

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


如果您需要在web应用程序启动之前初始化某些内容,请在构建web主机之后但在启动主机之前进行初始化。因此,您的
程序.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();
}
publicstaticvoidmain(字符串[]args)
{
//创建并构建主机以使DI容器可用
var host=CreateHostBuilder(args.Build();
//创建可以在其中完成初始化的DI服务范围
使用(var scope=host.Services.CreateScope())
{
//检索服务并初始化任何内容
var token=scope.ServiceProvider.GetService();
token.Initialize();
}
//启动启动的主机,例如ASP.NET核心web应用程序
host.Run();
}

这使用.NET Core 3.x中的通用HostBuilder。如果您仍在使用WebHostBuilder,那么它看起来几乎与WebHostBuilder相同;只需在返回的Web主机上操作即可。

谢谢您的回复。所以若我想在服务器提供服务之前初始化此数据,我需要在BuildWebHost之前初始化数据,对吗?这意味着我不能在那里使用ValidationToken类?最好的方法是在程序主void上编写新的初始方法?构建web主机创建服务提供者。如果您需要在此之前进行初始化,那么在这里就不能依赖依赖依赖项注入。什么更好取决于你真正想要达到的目标。我不清楚为什么在构建web主机之前需要运行,因为API需要验证每个请求中的令牌。该API具有高流量和高并发性。若在同一时间有太多的请求将占用所有线程,这将导致sql连接无法使线程打开连接。。。所以我想先获取令牌列表,并将其放在内存缓存中。API是您尝试在这里启动的web应用程序吗?然后首先构建web主机,但不要启动它。这样,您就可以从DI访问服务,但应用程序还不会回复请求。@Cacha如果它的行为与您描述的一样,那么您就会遇到另一个问题:您的API没有按应有的方式扩展。不要戴创可贴。解决您的问题。“API具有高流量和高并发性。如果同时有太多的请求,这将占用所有线程,这将导致sql连接无法使线程打开连接…因此我想先获取令牌列表并将其放在内存缓存中。”您的这一评论使这成为一个x-y问题。您的问题是您的API不能扩展到您的需求。因此,您可以要求任何数量的创可贴,但您总是会一次又一次地遇到实际问题。@Fildor此应用程序不是无状态应用程序,因此,如果我需要为其准备数据,我已经准备好了。但我认为你是对的。线程不足是基于问题的问题。。虽然我在主机运行之前就已经初始化了数据。我仍然在连接打开时超时。因为在这一刻没有任何线程可以使用。