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

打印 上一主题 下一主题

主题 881|帖子 881|积分 2643

这个库提供了在启动期间实例化已注册的单例,而不是在首次利用它时实例化。
单例通常在首次利用时创建,这大概会导致响应传入请求的延迟高于平常。在注册时创建实例有助于防止第一次Request请求的SLA
以往我们要在注册的时候启动单例大概会如许写:
  1. //注册:
  2. services.AddSingleton<FileChangeNotifier>();
  3. //初始化
  4. using var scope = services.BuildServiceProvider().CreateScope();
  5. scope.ServiceProvider.GetRequiredService<FileChangeNotifier>();
复制代码
但是借助Microsoft.Extensions.DependencyInjection.AutoActivation 我们的写法就特别的简单了:
  1. //注册服务,并直接实例化
  2. services.AddActivatedSingleton<FileChangeNotifier>();
复制代码
AutoActivation扩展库其实相当简单,内部实现了一个AutoActivationHostedService的 HostedService,当系统启动的时候就从IServiceProvider中取到全部注册为AutoActivation的单例,下面是他的源码:
  1. internal sealed class AutoActivationHostedService : IHostedService
  2. {
  3.     private readonly AutoActivatorOptions _options;
  4.     private readonly IServiceProvider _provider;
  5.     public AutoActivationHostedService(IServiceProvider provider, IOptions<AutoActivatorOptions> options)
  6.     {
  7.         _provider = provider;
  8.         _options = Throw.IfMemberNull(options, options.Value);
  9.     }
  10.     public Task StartAsync(CancellationToken cancellationToken)
  11.     {
  12.         foreach (var singleton in _options.AutoActivators)
  13.         {
  14.             _ = _provider.GetRequiredService(singleton);
  15.         }
  16.         foreach (var (serviceType, serviceKey) in _options.KeyedAutoActivators)
  17.         {
  18.             _ = _provider.GetRequiredKeyedService(serviceType, serviceKey);
  19.         }
  20.         return Task.CompletedTask;
  21.     }
  22.     public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
  23. }
复制代码
固然提供的扩展不限于AddActivatedSingleton一个,还有如下的扩展方法:
  1. public static IServiceCollection ActivateSingleton<TService>(this IServiceCollection services)
  2. public static IServiceCollection ActivateSingleton(this IServiceCollection services, Type serviceType)
  3. public static IServiceCollection AddActivatedSingleton<TService, TImplementation>(this IServiceCollection services, Func<IServiceProvider, TImplementation> implementationFactory)
  4. public static IServiceCollection AddActivatedSingleton<TService, TImplementation>(this IServiceCollection services)
  5. public static IServiceCollection AddActivatedSingleton<TService>(this IServiceCollection services, Func<IServiceProvider, TService> implementationFactory)
  6. public static IServiceCollection AddActivatedSingleton<TService>(this IServiceCollection services)
  7. public static IServiceCollection AddActivatedSingleton(this IServiceCollection services, Type serviceType)
  8. public static IServiceCollection AddActivatedSingleton(this IServiceCollection services, Type serviceType, Func<IServiceProvider, object> implementationFactory)
  9. public static IServiceCollection AddActivatedSingleton(this IServiceCollection services, Type serviceType, Type implementationType)
  10. public static void TryAddActivatedSingleton(this IServiceCollection services, Type serviceType)
  11. public static void TryAddActivatedSingleton(this IServiceCollection services, Type serviceType, Type implementationType)
  12. public static void TryAddActivatedSingleton(this IServiceCollection services, Type serviceType, Func<IServiceProvider, object> implementationFactory)
  13. public static void TryAddActivatedSingleton<TService>(this IServiceCollection services)
  14. public static void TryAddActivatedSingleton<TService, TImplementation>(this IServiceCollection services)
  15. public static void TryAddActivatedSingleton<TService>(this IServiceCollection services, Func<IServiceProvider, TService> implementationFactory)
  16. public static IServiceCollection ActivateKeyedSingleton<TService>(this IServiceCollection services, object? serviceKey)
  17. public static IServiceCollection ActivateKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey)
  18. public static IServiceCollection AddActivatedKeyedSingleton<TService, TImplementation>(this IServiceCollection services, object? serviceKey, Func<IServiceProvider, object?, TImplementation> implementationFactory)
  19. public static IServiceCollection AddActivatedKeyedSingleton<TService, TImplementation>(this IServiceCollection services, object? serviceKey)
  20. public static IServiceCollection AddActivatedKeyedSingleton<TService>(this IServiceCollection services, object? serviceKey, Func<IServiceProvider, object?, TService> implementationFactory)
  21. public static IServiceCollection AddActivatedKeyedSingleton<TService>(this IServiceCollection services, object? serviceKey)
  22. public static IServiceCollection AddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey)
  23. public static IServiceCollection AddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey, Func<IServiceProvider, object?, object> implementationFactory)
  24. public static IServiceCollection AddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey, Type implementationType)
  25. public static void TryAddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey)
  26. public static void TryAddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey, Type implementationType)
  27. public static void TryAddActivatedKeyedSingleton(this IServiceCollection services, Type serviceType, object? serviceKey, Func<IServiceProvider, object?, object> implementationFactory)
  28. public static void TryAddActivatedKeyedSingleton<TService>(this IServiceCollection services, object? serviceKey)
  29. public static void TryAddActivatedKeyedSingleton<TService, TImplementation>(this IServiceCollection services, object? serviceKey)
  30. public static void TryAddActivatedKeyedSingleton<TService>(this IServiceCollection services, object? serviceKey, Func<IServiceProvider, object?, TService> implementationFactory)
复制代码
最近我在Biwen.Settings添加了对JSON配置监听的功能,有这方面的需求,最初是有一个Start方法,也就是启动系统的时候获取服务然后调用Start方法,如果利用了AutoActivation 那Start的方法体可以直接利用构造函数替换,这个也是除了开头办理SLA以外的一个用例吧
有任何不足的地方欢迎小伙伴们留言指正

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表