先读一篇注入入门 全面理解 ASP.NET Core 依赖注入, 学习一下基本使用

然后学习一招, 不使用接口规范, 直接写功能类, 一般情况下可以用来做单例.

参考https://www.cnblogs.com/tcjiaan/p/8732848.html

如何在StartUp中的ConfigureServices方法里直接调用刚刚添加好的注册?

// redis注入

services.AddSingleton<IRedisConnection>(k => { return new RedisConnection(6, Configuration["RedisConnectionString"]); });

方式一.

services.AddSingleton<IConnectionMultiplexer, ConnectionMultiplexer>(x =>
             { return x.GetService<IRedisConnection>().ConnectionMultiplexer; });

方式二

var sp = services.BuildServiceProvider();
services.AddSingleton<StackExchange.Redis.IConnectionMultiplexer>((x) => { return sp.GetService<IRedisConnection>().ConnectionMultiplexer; });

services.AddScoped<ICacheManager, RedisCacheManager>();

如何在StartUp中的Configure方法里直接调用刚刚添加好的注册?

var 接口实例 = app.ApplicationServices.GetRequiredService<接口>();

当一个接口被多个不同的类来实现, 我们需要按需调用的时候

比如有一个接口

IFlyProvider{ Fly(); };

俩个实现类

FlyByPlaneProvider{};

FlyByRocketProvider{};

如何配置,  在public IServiceProvider ConfigureServices(IServiceCollection services)中如下操作

1. 先用断子绝孙法直接注册两个实现类

services.AddTransient<FlyByPlaneProvider>();
services.AddTransient<FlyByRocketProvider>();

2. 注册一个返回 Func<string,IFlyProvider>的项

services.AddTransient<Func<string, IFlyProvider>>(serviceProvider => key =>
{

if (key == "plane")
          return serviceProvider.GetService<CreateWezhanResponseProvider>();
      else
           return serviceProvider.GetService<FlyByRocketProvider>();

//用到了上面提到的 直接调用刚刚添加好的注册
});

3. 使用

比如, 这里有一个旅游管理  ITravelManager接口, 里面有个方法, FLyToRoma(string key)

那么我们需要在实现类中

public class TravelManager: ITravelManager
     {

private readonly Func<string, IFlyProvider> _providerAccessor;

FLyToRoma(string key){

var provider=_providerAccessor(key);

provider.Fly();

…………………

}

在SingleTon的Serivce中, 如何获取其他的Service?

这里, 我们有一个定时任务, 需要每隔N分钟, 去数据库里做一些事情, 于是我们希望使用HostedService+Timer完成这个任务.

services.AddSingleton<Microsoft.Extensions.Hosting.IHostedService, MYHostedService>();

services.AddScoped<IXService, XService>(); //

在MYHostedService中, 我们不能使用构造函数来注入 IXService, 因为MyHostedService是单例的, 这样注入的IXService也是单例的. 访问数据库的话, 连接用完释放关闭就直接GG.

所以, 不能使用构造函数注入.

那么, 我们可以注入一个  IServiceProvider services , 这玩意就是我们上面马上获取实例的构造Provider. 这个可是单例的. 我们注入这个进来是不是就可以用它来生成我们的IXService呢?

回报错

System.InvalidOperationException: 'Cannot consume scoped service 'IXService' from singleton 'Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor'.'

正确方法

The reason you're not allowed to do this is because MyHostedService has a singleton lifetime, which is a longer lifetime than scoped. The basic assumption here is that a service that is registered as scoped should not be kept alive indefinitely, this could easily happen if a singleton service keeps a reference to a scoped service.

I think the solution you're looking for is to inject IServiceProvider into MyHostedService, use it to create a new scope and new XService instance whenever you need it.

That is, replace

_xService.Foo();

with

using(var scope = _serviceProvider.CreateScope()) {
var xService = scope.ServiceProvider.GetService<IXService>();
xService.Foo();
}

An alternative, of course, would be to simply register XService as a singleton, by just replacing the call to AddScoped with AddSingleton, but I would not recommend it.

Edit: I must admit to not reading your link before posting my response. However, I still think this is the most elegant solution.

摘自(https://stackoverflow.com/questions/52020799/net-core-dependency-injection-to-hosted-service/52020992#52020992)

asp.net core 依赖注入几种常见情况的更多相关文章

  1. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  2. [译]ASP.NET Core依赖注入深入讨论

    原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...

  3. ASP.NET Core依赖注入解读&使用Autofac替代实现【转载】

    ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac实现和自定义实现扩展方法 3.1 安装Autof ...

  4. ASP.NET Core 依赖注入基本用法

    ASP.NET Core 依赖注入 ASP.NET Core从框架层对依赖注入提供支持.也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core的开发模式.本文将介绍依赖注入的基本概念,并 ...

  5. ASP.NET Core依赖注入——依赖注入最佳实践

    在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用 ...

  6. ASP.NET Core 依赖注入最佳实践——提示与技巧

    在这篇文章,我将分享一些在ASP.NET Core程序中使用依赖注入的个人经验和建议.这些原则背后的动机如下: 高效地设计服务和它们的依赖. 预防多线程问题. 预防内存泄漏. 预防潜在的BUG. 这篇 ...

  7. ASP.NET Core依赖注入最佳实践,提示&技巧

    分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...

  8. ASP.NET Core 依赖注入(构造函数注入,属性注入等)

    原文:ASP.NET Core 依赖注入(构造函数注入,属性注入等) 如果你不熟悉ASP.NET Core依赖注入,先阅读文章: 在ASP.NET Core中使用依赖注入   构造函数注入 构造函数注 ...

  9. ASP.NET Core 依赖注入最佳实践与技巧

    ASP.NET Core 依赖注入最佳实践与技巧 原文地址:https://medium.com/volosoft/asp-net-core-dependency-injection-best-pra ...

随机推荐

  1. 《OpenCV3编程入门》学习笔记

    把第一章的例程看完了,除了基本的操作函数,还了解了跟视频操作有关的函数,发现在自己的中心偏检测中,不仅可以处理图片,还可以对视频进行处理. 问题解决方案 1.0x7547d36f 处有未经处理的异常: ...

  2. QQ的发展演变

    在其发展史上,以色列人功不可没.正是四位以色列籍的年轻人,在1996年7月成立的Mirabilis公司,并于同年11月推出了全世界第一个即时通讯软件ICQ,取意为“我在找你”——“I Seek You ...

  3. 包建强的培训课程(16):Android新技术入门和提高

    @import url(/css/cuteeditor.css); Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈 ...

  4. Android开发 - 掌握ConstraintLayout(十)按比例设置视图大小

    有时候在布局界面的时候,UI要求某个View或者某张图片按比例显示,以适应不同的屏幕分辨率. 通常我们时通过自定义View或者引入第三方的库来解决.现在我们既然已经使用了ConstraintLayou ...

  5. UML2.0最新版入门图解

    一.UML概述 UML(UnifiedModelingLanguage)统一建模语言,是面向对象软件的标准化建模语言.由于面向对象软件开发需要经过OOA(面向对象分析),OOD(面向对象设计),OOP ...

  6. 吴恩达机器学习笔记40-用调和平均数F来进行查准率和查全率之间的权衡(Trading Off Precision and Recall by F sore)

    在很多应用中,我们希望能够保证查准率和查全率的相对平衡. 我们可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同: 我们希望有一个帮助我们选择这个阀值的方法.一种方法 ...

  7. 用Ajax遍历三级下拉框

    用Ajax遍历三级下拉框 //通过一级分类的id查二级分类(记得在前端网页按钮绑定点击事件) function getSecondCategory(oneCategoryId){ alert(&quo ...

  8. 机器学习入门09 - 特征组合 (Feature Crosses)

    原文链接:https://developers.google.com/machine-learning/crash-course/feature-crosses/ 特征组合是指两个或多个特征相乘形成的 ...

  9. 【雷神源码解析】无基础看懂AAC码流解析,看不懂你打我

    一 前言 最近在尝试学习一些视频相关的知识,随便一搜才知道原来国内有雷神这么一个真正神级的人物存在,尤其是在这里(传送门)看到他的感言更是对他膜拜不已,雷神这种无私奉献的精神应当被我辈发扬光大.那写这 ...

  10. ALL_DB_LINKS

    类型:View Owner:SYS 内容:记录了当前用户下可访问的所有的DB links 字段: OWNER : DB Link的owner DB_LINK : DB Link名称 USERNAME ...