【C#】.net core 6.0 依赖注入生命周期

这篇具有很好参考价值的文章主要介绍了【C#】.net core 6.0 依赖注入生命周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

给自己一个目标,然后坚持一段时间,总会有收获和感悟!
对于.net core而言,依赖注入生命周期有三种瞬态(Transient)、作用域(Scoped)和单例(Singleton),无论使用哪种生命周期,都需要确保对象的线程安全性,并正确地处理依赖关系。

【C#】.net core 6.0 依赖注入生命周期,C#,Asp.Net Core,c#,.netcore,依赖注入,生命周期

一、程序生命周期

在了解依赖注入的生命周期前,我们先建单了解下应用程序的生命周期,
在 .NET Core 6.0 中,应用程序的生命周期包括以下阶段:

2.1、构造函数

在应用程序启动时,会调用构造函数来创建主机(Host)对象。

2.2、配置

在构造函数之后,会调用配置方法来设置应用程序的配置,例如添加服务、配置中间件等。

2.3、启动

配置完成后,会调用启动方法来启动应用程序,包括启动 HTTP 服务器、启动后台服务等。

2.4、运行

应用程序开始监听请求并进行处理,这是应用程序的主要运行阶段。

2.5、停止

当应用程序接收到停止信号时(如收到终止命令或服务器关闭),会触发停止方法来执行一些清理操作。

2.6、释放资源

在停止之后,应用程序释放资源并进行善后工作,如关闭数据库连接、释放资源等。

除了上述阶段外,还可以通过使用生命周期中的事件钩子来添加自定义逻辑,以便在特定时刻执行某些代码。
需要注意的是,不同类型的应用程序(如控制台应用程序、Web 应用程序等)的生命周期可以有所不同,但上述阶段是通用的核心生命周期。

二、依赖注入生命周期

在 .NET Core 6.0 中,依赖注入服务的生命周期有三种:瞬态(Transient)、作用域(Scoped)和单例(Singleton)。

2.1、瞬态生命周期

在每次请求时都会创建一个新的实例,并在请求结束时立即销毁该实例,适用于轻量级的对象。这种生命周期可以通过
services.AddTransient 方法进行注册。

2.2、作用域生命周期

在每个 HTTP 请求处理期间,会使用同一个实例,请求结束时实例也会被销毁,适用于线程安全的对象,如 EF 上下文。这种生命周期可以通过
services.AddScoped 方法进行注册。

2.3、单例生命周期

在整个应用程序生命周期中只会创建一个实例,适用于被多处使用的对象,如配置信息、单例服务等。这种生命周期可以通过
services.AddSingleton 方法进行注册。

除了上述生命周期外,还可以通过 services.AddSingleton 方法传递一个工厂方法,以实现自定义的生命周期管理。
无论使用哪种生命周期,都需要确保对象的线程安全性,并正确地处理依赖关系。正确使用依赖注入可以提高代码的可测试性和可维护性,将对象的创建和销毁等生命周期管理交由 DI 容器负责,从而简化代码的编写。

三、代码举例

当使用 .NET Core 6.0 进行依赖注入时,可以使用以下代码示例来演示瞬态、作用域和单例生命周期

3.1、瞬态生命周期

public interface ITransientService
{
void DoSomething();
}

public class TransientService : ITransientService
{
private readonly Guid _id;

public TransientService()
{
    _id = Guid.NewGuid();
}

public void DoSomething()
{
    Console.WriteLine($"TransientService ID: {_id}");
}

}

// 在 Startup.cs 的 ConfigureServices 方法中添加以下代码:
services.AddTransient<ITransientService, TransientService>();

// 在需要使用服务的地方,使用构造函数注入:
public class MyController
{
private readonly ITransientService _transientService;

public MyController(ITransientService transientService)
{
    _transientService = transientService;
}

// 使用服务
public void MyAction()
{
    _transientService.DoSomething();
}

}

3.2、作用域生命周期

public interface IScopeService
{
void DoSomething();
}

public class ScopeService : IScopeService
{
private readonly Guid _id;

public ScopeService()
{
    _id = Guid.NewGuid();
}

public void DoSomething()
{
    Console.WriteLine($"ScopeService ID: {_id}");
}

}

// 在 Startup.cs 的 ConfigureServices 方法中添加以下代码:
services.AddScoped<IScopeService, ScopeService>();

// 在需要使用服务的地方,使用构造函数注入:
public class MyController
{
private readonly IScopeService _scopeService;

public MyController(IScopeService scopeService)
{
    _scopeService = scopeService;
}

// 使用服务
public void MyAction()
{
    _scopeService.DoSomething();
}

}

3.3、单例生命周期

public interface ISingletonService
{
void DoSomething();
}

public class SingletonService : ISingletonService
{
private readonly Guid _id;

public SingletonService()
{
    _id = Guid.NewGuid();
}

public void DoSomething()
{
    Console.WriteLine($"SingletonService ID: {_id}");
}

}

// 在 Startup.cs 的 ConfigureServices 方法中添加以下代码:
services.AddSingleton<ISingletonService, SingletonService>();

// 在需要使用服务的地方,使用构造函数注入:
public class MyController
{
private readonly ISingletonService _singletonService;

public MyController(ISingletonService singletonService)
{
    _singletonService = singletonService;
}

// 使用服务
public void MyAction()
{
    _singletonService.DoSomething();
}

}

以上示例展示了如何在 .NET Core 6.0 中注册和使用瞬态、作用域和单例生命周期的依赖注入服务。
根据实际需求,选择适合的生命周期以确保正确的对象创建和销毁,并维护正确的对象状态。

四、自定义管理

当通过 services.AddSingleton 方法传递一个工厂方法时,可以使用委托来创建自定义的生命周期管理。

  • 下面是一个示例代码:
    首先,定义一个自定义的服务类 CustomService:
    public class CustomService
    {
    public DateTime CreatedAt { get; }

    public CustomService()
    {
    CreatedAt = DateTime.Now;
    }
    }

然后,在应用程序启动时,注册该服务并传递一个工厂方法来实现自定义的生命周期管理:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(serviceProvider =>
{
// 创建 CustomService 对象,并进行自定义的处理
var customService = new CustomService();

        // 在此可以添加自定义的生命周期管理逻辑

        return customService;
    });

    // 其他服务的注册
    // ...
}

}

在上述示例中,通过 services.AddSingleton(serviceProvider => { … }) 方法向 DI 容器注册了一个 CustomService 类型的单例服务,传递了一个工厂方法作为参数。
在这个工厂方法中,我们可以自定义创建 CustomService 对象的方式,并进行额外的处理。
这样,当通过 DI 容器解析 CustomService 时,每次获取到的都是通过工厂方法创建的同一个实例,而且可以根据需要在工厂方法中进行自定义的生命周期管理操作。
需要注意的是,工厂方法可以接收一个 IServiceProvider 参数,以便在创建服务实例时获取其他已注册的服务。这在某些场景下可能会很有用。

五、依赖注入原理

在 .NET Core 6.0 中,依赖注入(DI)是一个重要的功能,它通过提供、解析和跟踪应用程序中的各种服务对象来帮助解耦和组织代码。
依赖注入的原理主要包括以下几个方面:
1.服务注册:在应用程序启动时,通过使用
IServiceCollection 接口的 AddTransient、AddScoped、AddSingleton 等方法将服务类型和其生命周期添加到 DI 容器中。
2.服务解析:当需要使用某个服务的实例时,可以通过 DI 容器提供的
IServiceProvider 接口的 GetRequiredService、GetService 等方法来获取该服务的实例,其中 T 是服务类型。
3.生命周期管理:DI 容器会根据服务的生命周期设置来控制服务对象的创建和销毁。根据服务的生命周期,可以使用
AddTransient、AddScoped、AddSingleton 方法注册瞬态、作用域和单例服务。

  • 瞬态(Transient)生命周期表示每次通过 DI 容器获取服务时都会创建一个新的实例。
  • 作用域(Scoped)生命周期表示在同一个作用域内(例如,相同的 HTTP 请求)获取服务时将使用同一个实例。
  • 单例(Singleton)生命周期表示整个应用程序中只创建一个实例,并且所有的请求都会使用同一个实例。
    1.依赖关系解析:DI 容器能够自动解析服务对象之间的依赖关系,即当需要解析某个服务时,DI 容器会自动创建该服务所依赖的其他服务实例,并将其注入到需要的位置上。
    2.服务扩展:通过扩展
    IServiceCollection 接口,可以自定义添加和配置服务,使得 DI 容器能够支持更多的功能和扩展。

总体而言,.NET Core 6.0 的依赖注入原理基于 DI 容器、服务注册、服务解析和生命周期管理,帮助开发者更好地组织和管理应用程序中的各种服务对象,提高代码的可扩展性、可测试性和松耦合性。文章来源地址https://www.toymoban.com/news/detail-768411.html

到了这里,关于【C#】.net core 6.0 依赖注入生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • asp.net core webapi如何执行周期性任务

    新建asp.net core webapi项目,使用Nuget搜索安装Quartz包。 注意:定时执行时间格式,参考连接:https://www.cnblogs.com/wudequn/p/8506938.html 在IIS中找到这个站点所用的程序池,点击“高级设置…” 在打开的列表中更改以下设置: 回收——固定时间间隔(分钟) 改为 0 ——虚拟/专用内存

    2024年02月13日
    浏览(29)
  • .Net Core核心概念——依赖注入和中间件

    1. 为什么要用依赖注入(DI) 什么是依赖注入,为什么要使用呢?简单通俗说就是一个类需要另一个类来协助工作,就产生了依赖,所以需要的依赖项就要【注入】过来一起来协同完成工作。 软件设计原则中有一个依赖倒置原则(DIP)讲的是要依赖于抽象,不要依赖于具体,高层

    2024年02月08日
    浏览(29)
  • 【ASP.NET Core】在 Mini-API 中注入服务

    经过版本更新,Mini API 的功能逐步完善,早期支持得不太好的 mini API 现在许多特性都可以用了,比如灰常重要的依赖注入。 咱们先来个相当简单的注入测试。来,定义一个服务类,为了偷懒,老周这里就不使用 接口 + 实现类 的方式了。 此服务类提供给外部调用的公共方法

    2024年02月08日
    浏览(32)
  • .Net6 Web Core API 配置 Autofac 封装 --- 依赖注入

    目录 一、NuGet 包导入 二、Autofac 封装类 三、Autofac 使用 四、案例测试 下列封装 采取 程序集注入方法 , 单个依赖注入, 也适用, 可依赖注入的地方配置 Autofac Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy    

    2024年02月14日
    浏览(29)
  • 【C#】.net core 6.0 使用第三方日志插件Log4net,配置文件详细说明

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年04月12日
    浏览(35)
  • 【服务器】ASP.Net Core(C#)创建Web站点

    简单几步实现本地ASP.Net.Core web 站点结合cpolar内网穿透工具实现远程访问 1. 创建站点 *环境搭建,这边测试,使用.NET 6.0 SDK,可以点击跳转到官网下载,下载后安装即可. 安装完成后,进入到某个文件夹,打开powershell执行下面命令,创建新的 Web 应用,名称叫:aspnetcoreapp 2. 运行站点 信任开

    2024年02月11日
    浏览(37)
  • C# ASP.NET Core Web API 身份授权(JWT)验证(一)

    1.开发环境 VS2022,安装时记得勾选ASP.NET有关的都选上,建议全选,省的麻烦。          2.创建初始工程 TestApi (你自己的工程名称)。    这就创建工程成功了,按 F5 则可以进行调试了。 而在项目中,我们不仅仅会用到基础的api功能,我们一般还会用到  身份授权(J

    2024年02月02日
    浏览(39)
  • 在 C#和ASP.NET Core中创建 gRPC 客户端和服务器

    gRPC 是一种可以跨语言运行的现代高性能远程过程调用 (RPC) 框架。gRPC 实际上已经成为 RPC 框架的行业标准,Google 内外的组织都在使用它来从微服务到计算的“最后一英里”(移动、网络和物联网)的强大用例。 gRPC是一个高性能的开源的通用RPC框架,由Google公司开发,支持常

    2024年04月23日
    浏览(21)
  • .NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法

    前段时间有朋友问道一个这样的问题,.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类,然后通过依赖注入(DI)的方式获取对应服务的方法并通过反射动态执行类的方法,从而实现更灵活的编程

    2023年04月15日
    浏览(33)
  • asp.net core6 webapi 使用反射批量注入接口层和实现接口层的接口的类到ioc中

    IBLL接口层类库 BLL实现接口层类库 program中利用反射批量注入 在控制器中使用构造函数传参就可以调用已经注册的所有是是实现接口的类了的实列了

    2024年02月13日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包