先读一篇注入入门 全面理解 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. 有哪些知名的公司在用Python

    谷歌:Google App Engine.code.Google.com.Google earth.谷歌爬虫.Google广告等项目都在大量使用Python开发 CIA:美国中情局网站就是用Pytho ...

  2. C语言fprintf, fwrite, fscanf, fread混用问题

    int main(int argc, const char * argv[]) { // insert code here... FILE * fp = fopen("test.txt&qu ...

  3. 性能测试-----monkey稳定性测试

    我们稳定性测试用的monkey,跑monkey的同时存储log monkey脚本: @echo.@set /p name=请输入你的名字(比如liuyl): set YYYYmmdd=%date:~0 ...

  4. Debian 8下手工安装 Eclipse CDT neon.2

    从 http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/neon2 下载 eclipse-cpp-neon-2-li ...

  5. day20_雷神_django第三天

    django第三天 动态路由,实现统一删除功能 urls url(r'^host_del/(host|user|group)/(\d+)$',views.host_del,name='del'), t ...

  6. PB开发境界 多个DW进行update

      多个DW进行update //菜鸟代码dw_1.Update()dw_2.Update()初级代码IF dw_1.Update() = 1 And dw_2.Update() = 1 THEN  ...

  7. Windows 10 IoT Serials 11 – 如何设置微软认知服务中EndPoint

    1.问题描述 在UWP应用开发过程中,如果要使用微软认知服务,很多开发者会使用Microsoft.Oxford.Face.Microsoft.Oxford.Vision的NuGet包来完成.如果在vi ...

  8. vue单页应用前进刷新后退不刷新方案探讨

    引言 前端webapp应用为了追求类似于native模式的细致体验,总是在不断的在向native的体验靠拢:比如本文即将要说到的功能,native由于是多页应用,新页面可以启用一个的新的webview ...

  9. Akka-Cluster(5)- load-balancing with backoff-supervised stateless computation - 无状态任务集群节点均衡分配

    分布式程序运算是一种水平扩展(scale-out)运算模式,其核心思想是能够充分利用服务器集群中每个服务器节点的计算资源,包括:CPU.内存.硬盘.IO总线等.首先对计算任务进行分割,然后把细分的任务 ...

  10. pycharm激活方式

    进入C:\Windows\System32\drivers\etc替换host文件,或者在host文件后加入0.0.0.0 account.jetbrains.com然后断网,断网,断网!最后输入K7 ...