经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
NET8中增加的简单适用的DI扩展库Microsoft.Extensions.DependencyInjection.AutoActivation
来源:cnblogs  作者:万雅虎  时间:2024/6/12 16:21:45  对本文有异议

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

单例通常在首次使用时创建,这可能会导致响应传入请求的延迟高于平时。在注册时创建实例有助于防止第一次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<T>一个,还有如下的扩展方法:

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

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

原文链接:https://www.cnblogs.com/vipwan/p/18242343

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号