首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在多线程的Microsoft.Extensions.Logging中包含DependencyInjection作用域?

在多线程的Microsoft.Extensions.Logging中包含DependencyInjection作用域的方法是使用ILoggerFactory.CreateLogger<T>方法创建一个泛型Logger实例,并在每个线程中使用IServiceScopeFactory.CreateScope方法创建一个新的作用域。然后,可以使用作用域中的IServiceProvider获取所需的依赖项。

以下是一个示例代码:

代码语言:txt
复制
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;

public class Worker
{
    private readonly ILogger<Worker> _logger;
    private readonly IServiceScopeFactory _serviceScopeFactory;

    public Worker(ILogger<Worker> logger, IServiceScopeFactory serviceScopeFactory)
    {
        _logger = logger;
        _serviceScopeFactory = serviceScopeFactory;
    }

    public void DoWork()
    {
        _logger.LogInformation("Worker started.");

        // 在每个线程中创建一个新的作用域
        using (var scope = _serviceScopeFactory.CreateScope())
        {
            var serviceProvider = scope.ServiceProvider;

            // 使用作用域中的依赖项
            var myDependency = serviceProvider.GetRequiredService<IMyDependency>();
            myDependency.DoSomething();
        }

        _logger.LogInformation("Worker finished.");
    }
}

public interface IMyDependency
{
    void DoSomething();
}

public class MyDependency : IMyDependency
{
    private readonly ILogger<MyDependency> _logger;

    public MyDependency(ILogger<MyDependency> logger)
    {
        _logger = logger;
    }

    public void DoSomething()
    {
        _logger.LogInformation("Doing something...");
    }
}

public class Program
{
    public static void Main()
    {
        var serviceProvider = new ServiceCollection()
            .AddLogging(builder =>
            {
                builder.AddConsole();
            })
            .AddTransient<IMyDependency, MyDependency>()
            .BuildServiceProvider();

        var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
        var logger = loggerFactory.CreateLogger<Worker>();

        var worker = new Worker(logger, serviceProvider.GetRequiredService<IServiceScopeFactory>());
        worker.DoWork();
    }
}

在上面的示例中,我们首先创建了一个ServiceProvider,并注册了ILoggerFactory、IMyDependency和MyDependency。然后,我们使用ILoggerFactory创建了一个泛型Logger实例,并将其传递给Worker类的构造函数。在Worker类的DoWork方法中,我们使用IServiceScopeFactory创建了一个新的作用域,并从作用域中获取了IMyDependency的实例,然后调用其DoSomething方法。

这样,每个线程都有自己的作用域和依赖项,可以在多线程环境中正确地使用Microsoft.Extensions.Logging和DependencyInjection。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ASP.NET Core 6框架揭秘实例演示:日志进阶用法

在接下来演示实例,我们将一个包含多个处理步骤事务作为日志范围,并将各个步骤执行耗时记录下来。如下面的代码片段所示,我们利用依赖注入容器创建一个ILogger对象。...using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System.Diagnostics...在我们演示程序,执行事务包含三个操作(Foo、Bar和Baz)。我们将事务开始那一刻作为基准,记录每个操作完成时间。...using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System.Diagnostics...using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System.Diagnostics

48720
  • .NET 扩展官方 Logger 实现将日志保存到本地文件

    .NET 项目默认情况下 日志是使用 ILogger 接口,默认提供一下四种日志记录程序: 控制台 调试 EventSource EventLog 这四种记录程序都是默认包含在 .NET 运行时库。...今天给大家分享自己实现一个日志记录程序,继承自  ILogger 接口,实现将日志记录到本地 txt 文件,并包含一个自动清理过期日志功能任务。...类库整体代码结构如下:  Models 文件夹存放 LoggerSetting.cs 是 该模块注入服务时需要配置参数 namespace Logger.LocalFile.Models {.../// 保存天数 /// public int SaveDays { get; set; } = 7; } } Tasks 文件夹存放...,内容如下 using Logger.LocalFile.Models; using Logger.LocalFile.Tasks; using Microsoft.Extensions.DependencyInjection

    86030

    .NET Core 日志与分布式链路追踪

    目录 .NET Core 日志与分布式链路追踪 .NET Core 日志 控制台输出 非侵入式日志 Microsoft.Extensions.Logging ILoggerFactory ILoggerProvider...分布式链路跟踪 在不同进程中跟踪 在 ASP.NET Core 中跟踪 OpenTracing API 和 Jaeger 链路追踪实践 .NET Core 日志与分布式链路追踪 程序记录日志一般有两种作用....NET Core 日志组件有很多,但是流行日志框架基本都会实现 Microsoft.Extensions.Logging.Abstractions,因此我们可以学习Microsoft.Extensions.Logging...Microsoft.Extensions.Logging 软件包包含 Logging API ,这些 Logging API 不能独立运行。...我们通过访问活动跨度scope.Span,一旦关闭了作用,先前作用将成为当前作用,从而重新激活当前线程先前活动范围; IScope 继承 IDisposable,它使我们可以使用using语法

    1.5K30

    《ASP.NET Core 微服务实战》-- 读书笔记(第11章)

    年,它定义了浏览器和服务器之间建立持久双向 Socket 连接标准 这让服务器向运行于浏览器 Web 应用发送数据称为可能,期间不需要由 Web 应用执行“轮询” 在底层实现,浏览器向服务器请求连接进行升级...握手完成后,浏览器和服务器将切换为单独二进制 TCP 连接,以实现双向通信 部署模式 假如所有服务器都运行在亚马逊云弹性计算服务环境 当虚拟机被托管在云基础设施时,它们就可能随时被搬移、销毁并重建...,并在云环境自由地搬移,我们需要挑选一种消息服务,把一定实时通信能力提取到进程之外 下面列举一些厂商,他们提供云消息服务有的是独立产品,有的则是大型服务套件一部分: Apigee (API 网关与实时消息通信...我们示例监控服务将包含一系列不同组件 首先,我们需要消费由第 6 章编写服务生成并放入队列 ProximityDetectedEvent 事件 此后,我们要提取事件原始信息,调用团队服务以获取可供用户读取识别的信息...为实时接近监控服务创建界面 为简化工作,同时掩盖我缺乏艺术细胞真相,我将用一个不包含图形元素简单 HTML 页面,它不需要托管在专门 Web 服务器上 它实时地监听接近事件,并将携带信息动态添加到新

    61600

    探索 .NET Core 依赖注入 IServiceCollection

    如果您使用了.NET Core,则很可能已使用Microsoft.Extensions.DependencyInjection内置依赖项注入容器,在本文中,我想更深入地了解Microsoft Dependency...Microsoft依赖项注入容器只是一组类,它们组合到一个代码库,这个库会自动创建并管理程序需要对象。...服务生命周期 在Microsoft依赖项注入框架,我们可以使用三种生命周期注册服务,分别是单例(Singleton)、瞬时(Transient)、作用(Scoped),在上面的代码,我使用了AddSingleton...使用Singleton服务优点是我们不会创建多个服务实例,只会创建一个实例,保存到DI容器,直到程序退出,这不仅效率高,而且性能高,但是有一个要注意点,如果在多线程中使用了Singleton,要考虑线程安全问题...作用(Scoped),在一个作用内,会使用同一个实例,像EF CoreDbContext上下文就被注册为作用服务。 我们注册服务时会发生什么? 在上面的代码,我已经注册了两个单例服务。

    3.9K32

    .NET Core日志:采用统一模式记录日志

    )实现对日志记录。....LoggerProvider创建Logger提供真正日志写入功能,即它作用就是将提供日志消息写到对应目的地(比如文件、数据库等)。...其中默认使用LoggerFactory和由它创建Logger定义在“Microsoft.Extensions.Logging”这个NuGet包。...我们可以看出格式化日志消息不仅仅包含我们指定消息内容,日志等级、类型和事件ID同样包含其中。不仅如此,表示日志等级文字还会采用不同前景色和背景色来显示。 ?...为了演示针对依赖注入LoggerFactory获取方式,我们首先需要作是在project.json文件按照如下方式添加针对“Microsoft.Extensions.DependencyInjection

    1K60

    Semantic Kernel 通过 LocalAI 集成本地模型

    SK 可以支持各种大模型,在官方示例多是OpenAI 和 Azure OpenAI service GPT 3.5+。今天我们就来看一看如何把SK 和 本地部署开源大模型集成起来。...; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.ChatCompletion...答案是肯定!让我们在内核添加一个日志。我们在第14行添加了日志支持。...我们想使用Azure,OpenAI中使用MicrosoftAI模型,以及我们LocalAI 集成本地大模型,我们可以将它们包含在我们内核。...InvokeStreamingAsync,第42行到46行代码所示,运行起来就可以体验下列效果: 本文示例源代码:https://github.com/geffzhang/sk-csharp-hello-world

    65310

    【ASP.NET Core 基础知识】--依赖注入(DI)--在ASP.NET Core中使用依赖注入

    使用services.AddScoped()来注册一个作用服务,每次请求会创建一个实例,但在同一个Http请求生命周期内共享同一个实例。...{ // 注册瞬态服务 services.AddTransient(); // 注册作用服务...1.2 定义服务 在ASP.NET Core实现依赖注入第二步是定义服务。服务是应用程序需要注入到其他组件对象或类。服务可以是瞬态、作用或单例,这取决于它们是如何注册。...在依赖注入(DI),控制反转通常指的是将对象创建和管理工作从应用程序代码移除,转而由外部容器(ASP.NET Core内置DI容器)来完成。...使用异步和多线程:在可能情况下,使用异步和多线程技术来优化性能,特别是在长时间运行任务

    33100

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

    也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core开发模式。本文将介绍依赖注入基本概念,并结合代码演示如何在 ASP.NET Core中使用依赖注入。 什么是依赖注入?...比如每一个HTTP请求都是一个作用,那么在这个请求处理过程,容器只会创建一个对象。...与Scoped对应还有其它生命周期,我们将服务生命周期列举如下: Transient:瞬时服务,表示每次使用都会创建新对象 Scoped:作用服务,表示每次请求只创建一个对象。...ASP.NET Core内置依赖注入框架未包含特性: 属性注入 基于名称注入 子容器 自定义生命周期管理 对lazy对象初始化Func支持 如果要是用这些功能,我们可以使用第三方框架。...首先添加 Autofac、Autofac.Extensions.DependencyInjection 引用 在Startup.ConfigureServices配置容器,并返回IServiceProvider

    2K20

    《ASP.NET Core 微服务实战》-- 读书笔记(第9章)

    第 9 章 微服务系统配置 微服务系统配置需要关注更多其他方面的因素,包括: 配置值安全读写 值变更审计能力 配置信息源本身韧性和可靠性 少量环境变量难以承载大型、复杂配置信息 应用要决定是否支持配置值在线更新和实时变更...,也可以把来自启动环境环境变量转发到容器内部,只要不传入包含等式即可,例如: $ docker run -e PORT -e CLIENTSCRET -e CLIENTKEY [...]...这一命令将把命令行所在终端 PORT、CLIENTSECRET 和 CLIENTKEY 环境变量值传入 Docker 容器,在这个过程它们值不会在命令行文本公开,以防范潜在安全漏洞和敏感信息泄露...如果需要向容器传入大量环境变量,可以向 docker 命令指定一个包含键值对列表文件: $ docker run --env-file ....opts 变量将包含应用所有的相关配置 启动配置服务器最简单方法就是直接通过 Docker 镜像运行以下代码 $ docker run -p 8888:8888 \ -e SPRING_CLOUD_CONFIG_SERVER_GET_URI

    51210
    领券