先读一篇注入入门 全面理解 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. $(document).on('click','.classname',function(){}); VS $('.classname').on('click',function(){});

    jquery中用on来绑定事件,经常的写法有$(document).on('click','.classname',function(){});$('.classname').on('click',f ...

  2. SQL给数据编号

    方法:ROW_NUMBER() over(order by getdate()) AS num 使用案例 : select * From (select  ROW_NUMBER() over(orde ...

  3. MFC中的一些视图

    本章主要介绍MFC中主要的视图类,这些继承自Cview类. 继承关系如上图所示. 滚动视图 CscrollView给Cview添加了基本的滚动功能,它包含WM_VSCROLL和WM_HSCROLL消息 ...

  4. SQL Server 深入解析索引存储(非聚集索引)

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...

  5. Java编程实现多线程TCP服务器完整实例

    Socket ·功能:TCP客户端套接字 ·构造方法:   Socket(InetAddress address, int port)   创建一个流套接字并将其连接到指定 IP 地址的指定端口号 · ...

  6. Java 多线程开发之 Callable 与线程池

    前言 我们常见的创建线程的方式有 2 种:继承 Thread 和 实现 Runnable 接口. 其实,在 JDK 中还提供了另外 2 种 API 让开发者使用. 二.简单介绍 2.1 Callabl ...

  7. IDEA一定要懂的32条快捷键

    阅读本文大概需要 2 分钟.   作者:帝都羊 这些IntelliJ IDEA键盘快捷键可以让你专注于编写代码,让你的双手在键盘上起舞. 1.搜索文件名: ↑   Shift 快速连续按两下 2.显示 ...

  8. ajax jsonp请求报错not a function的解决方案

    概述 最近工作中使用ajax,有时会报json4 is not a function的错误,有时又不会报错.找了很久,网上说是因为多次请求同一个资源导致的,但是我检查了自己的代码,对于重复资源并没有重 ...

  9. Java核心技术及面试指南 集合部分总的面试题归纳以及答案

    3.6.1ArrayList和LinkedList有什么差别?在哪种场景里应当用ArrayList(或LinkedList)? 大家如果学过数据结构,这个问题不难回答:前者是基于数组,数组比较擅长索引 ...

  10. ES6躬行记(6)——Symbol

    本节将会重点分析ES6引入的第6种基本类型:Symbol(符号).符号可以像字符串那样作为对象的属性名,只是它有唯一性的特点,可以避免属性名之间的冲突. 一.创建 符号没有字面量形式,只能通过Symb ...