• 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以外的一个用例吧

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

  • 相关阅读:
    系统部署常用操作_查看硬盘大小_查看内存情况_查看某个端口是否被占用_telnet_远程scp复制拉取---Linux运维工作笔记055
    centos7 离线升级/在线升级操作系统内核
    docker 部署 clickhouse
    安科瑞电池能源管理平台介绍
    android查漏补缺(2)四种编译目标
    数据结构-哈希表
    几个常见的js手写题,你能写出来几道
    JAVA毕业设计WEBOA办公信息管理系统计算机源码+lw文档+系统+调试部署+数据库
    关于Word转PDF的几种实现方案
    [MySQL]实训七
  • 原文地址:https://www.cnblogs.com/vipwan/p/18242343