• NET8中增加的简单适用的DI扩展库Microsoft.Extensions.DependencyInjection.AutoActivation


    这个库提供了在启动期间实例化已注册的单例,而不是在首次使用它时实例化。

    单例通常在首次使用时创建,这可能会导致响应传入请求的延迟高于平时。在注册时创建实例有助于防止第一次Request请求的SLA

    以往我们要在注册的时候实例单例可能会这样写:

    //注册:
    services.AddSingleton();
    //初始化
    using var scope = services.BuildServiceProvider().CreateScope();
    scope.ServiceProvider.GetRequiredService();
    

    但是借助Microsoft.Extensions.DependencyInjection.AutoActivation 我们的写法就特别的简单了:

    //注册服务,并直接实例化
    services.AddActivatedSingleton();
    

    AutoActivation扩展库其实相当简单,内部实现了一个AutoActivationHostedService的 HostedService,当系统启动的时候就从IServiceProvider中取到所有注册为AutoActivation的单例,下面是他的源码:

    internal sealed class AutoActivationHostedService : IHostedService
    {
        private readonly AutoActivatorOptions _options;
        private readonly IServiceProvider _provider;
    
        public AutoActivationHostedService(IServiceProvider provider, IOptions options)
        {
            _provider = provider;
            _options = Throw.IfMemberNull(options, options.Value);
        }
    
        public Task StartAsync(CancellationToken cancellationToken)
        {
            foreach (var singleton in _options.AutoActivators)
            {
                _ = _provider.GetRequiredService(singleton);
            }
    
            foreach (var (serviceType, serviceKey) in _options.KeyedAutoActivators)
            {
                _ = _provider.GetRequiredKeyedService(serviceType, serviceKey);
            }
    
            return Task.CompletedTask;
        }
    
        public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
    }
    

    当然提供的扩展不限于AddActivatedSingleton一个,还有如下的扩展方法:

    public static IServiceCollection ActivateSingleton<TService>(this IServiceCollection services)
    public static IServiceCollection ActivateSingleton(this IServiceCollection services, Type serviceType)
    public static IServiceCollection AddActivatedSingleton<TService, TImplementation>(this IServiceCollection services, Func implementationFactory)
    public static IServiceCollection AddActivatedSingleton<TService, TImplementation>(this IServiceCollection services)
    public static IServiceCollection AddActivatedSingleton<TService>(this IServiceCollection services, Func implementationFactory)
    public static IServiceCollection AddActivatedSingleton<TService>(this IServiceCollection services)
    public static IServiceCollection AddActivatedSingleton(this IServiceCollection services, Type serviceType)
    public static IServiceCollection AddActivatedSingleton(this IServiceCollection services, Type serviceType, Funcobject> implementationFactory)
    public static IServiceCollection AddActivatedSingleton(this IServiceCollection services, Type serviceType, Type implementationType)
    public static void TryAddActivatedSingleton(this IServiceCollection services, Type serviceType)
    public static void TryAddActivatedSingleton(this IServiceCollection services, Type serviceType, Type implementationType)
    public static void TryAddActivatedSingleton(this IServiceCollection services, Type serviceType, Funcobject> implementationFactory)
    public static void TryAddActivatedSingleton<TService>(this IServiceCollection services)
    public static void TryAddActivatedSingleton<TService, TImplementation>(this IServiceCollection services)
    public static void TryAddActivatedSingleton<TService>(this IServiceCollection services, Func implementationFactory)
     
    public static IServiceCollection ActivateKeyedSingleton<TService>(this IServiceCollection services, object? serviceKey)
    public static IServiceCollection ActivateKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey)
    public static IServiceCollection AddActivatedKeyedSingleton<TService, TImplementation>(this IServiceCollection services, object? serviceKey, Funcobject?, TImplementation> implementationFactory)
    public static IServiceCollection AddActivatedKeyedSingleton<TService, TImplementation>(this IServiceCollection services, object? serviceKey)
    public static IServiceCollection AddActivatedKeyedSingleton<TService>(this IServiceCollection services, object? serviceKey, Funcobject?, TService> implementationFactory)
    public static IServiceCollection AddActivatedKeyedSingleton<TService>(this IServiceCollection services, object? serviceKey)
    public static IServiceCollection AddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey)
    public static IServiceCollection AddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey, Funcobject?, object> implementationFactory)
    public static IServiceCollection AddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey, Type implementationType)
    public static void TryAddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey)
    public static void TryAddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey, Type implementationType)
    public static void TryAddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey, Funcobject?, object> implementationFactory)
    public static void TryAddActivatedKeyedSingleton<TService>(this IServiceCollection services, object? serviceKey)
    public static void TryAddActivatedKeyedSingleton<TService, TImplementation>(this IServiceCollection services, object? serviceKey)
    public static void TryAddActivatedKeyedSingleton<TService>(this IServiceCollection services, object? serviceKey, Funcobject?, TService> implementationFactory)
    

    最近我在Biwen.Settings添加了对JSON配置监听的功能,有这方面的需求,最初是有一个Start方法,也就是启动系统的时候获取服务然后调用Start方法,如果使用了AutoActivation 那Start的方法体可以直接使用构造函数替代,这个也是除了开头解决SLA以外的一个用例吧

    有任何不足的地方欢迎小伙伴们留言指正

  • 相关阅读:
    计算机毕业设计Java班主任管理系统(源码+系统+mysql数据库+lw文档)
    你们天天说的应用性能监控: Sky Walking
    CRM系统如何帮助企业数字化转型?分为几个阶段?
    浅谈安科瑞无线测温产品在巴西某工厂的应用
    【Java】常用的正则表达式
    java毕业设计基于VUE电脑城摊位出租系统mybatis+源码+调试部署+系统+数据库+lw
    JDBC 和 DDT2
    ESP8266--SDK开发(GPIO)
    【文末送书】1000道精心打磨的计算机考研题,408小伙伴不可错过
    推送多架构镜像到同一仓库
  • 原文地址:https://www.cnblogs.com/vipwan/p/18242343