C# 如何将并行依赖项注入到我的AspNetCore ICollection服务中?

C# 如何将并行依赖项注入到我的AspNetCore ICollection服务中?,c#,asp.net-core,dependency-injection,task-parallel-library,C#,Asp.net Core,Dependency Injection,Task Parallel Library,目前,我已将我注入的所有依赖项添加到我的ConfigureServices中 public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IConfiguration>(Configuration); //injecting my dependenies here services.AddDependencies(Configuration);

目前,我已将我注入的所有依赖项添加到我的ConfigureServices中

 public void ConfigureServices(IServiceCollection services)
 {
     services.AddSingleton<IConfiguration>(Configuration);
     //injecting my dependenies here
     services.AddDependencies(Configuration);
 }
我最初的做法如下:

public static IServiceCollection AddDependencies(this IServiceCollection services, IConfiguration configuration)
    {
        var t1 = Task.Run(() => { services.RegisterTypes(configuration);});
        var t2 = Task.Run(() => { services.RegisterFluentValidation();});
        var t3 = Task.Run(() => { services.RegisterMappingsWithAutomapper();});

        Task.WhenAll(t1, t2, t3).Wait();

        return services;
    }
但有时我会遇到一个异常,我的方法(比如RegisterTypes)在内部进行如下调用

services.Register<ISmtpConfig, SmtpConfig>(lifeTime);

有人能把我放在正确的位置吗?

我非常确定,在这里,您不能通过并行添加依赖项来改进某些东西。 实际上,此配置方法在应用程序启动时运行一次。在我的示例项目中(在VisualStudio内部的调试模式下),它只需要不到一秒钟的时间。在第二次运行时(只是为了确保它已经JIT了),比如6ms。VS显著降低了性能(首次运行时为700毫秒,首次运行时为300毫秒)。 因此,我建议您将秒表放在
ConfigureServices()
方法的开头,并放置类似

stopwatch.Stop();
Console.WriteLine($"Service initialization took {stopwatch.ElapsedMilliseconds} ms");
最后


也许您可以提供更多关于性能问题的线索?

我认为性能问题在于:一开始需要加载太多的类,而所有的类都来自不同的程序集,这将迫使web服务器将它们加载到内存中。但是它们应该是按需注册和加载的,您可以按照下面的帖子来实现它:

这不是注入依赖项的部分,您只需在任务中注册依赖项,而不需要在任务中注册依赖项,因为这只执行一次。这听起来像是一个错误。您遇到问题X,假设Y是解决方案,当问题解决失败时,您询问的是Y,而不是X。您不需要任务来注册服务。您试图解决的实际问题是什么?DI必须在处理请求之前按顺序进行,为什么要并行注入它们?你认为它可以提高很多性能吗?@alsami,你是对的,但是每次应用程序池回收后,都会再次进行。IServiceCollection集合不是线程安全的。不可能,电话的顺序很重要。即使在所有方法中都使用lock语句,注册也会按顺序运行,但随机顺序这是我在过去做过的事情,如果加载程序集并进行反射以注入一些标记的内容,它会大大提高性能,当然不会花一分钟,但这大大减少了我的时间。也许你能透露一些细节?需要多长时间?你为什么需要反思?
 private Object thisLock = new Object(); --> global variable  

 lock (thisLock)  
 {  
   services.Register<ISmtpConfig, SmtpConfig>(lifeTime);
 }
stopwatch.Stop();
Console.WriteLine($"Service initialization took {stopwatch.ElapsedMilliseconds} ms");