首页 > 编程语言 >【C#】.net core 6.0 通过依赖注入注册和使用上下文服务

【C#】.net core 6.0 通过依赖注入注册和使用上下文服务

时间:2023-12-25 11:08:00浏览次数:33  
标签:core httpContextAccessor IHttpContextAccessor C# 数据库 应用程序 6.0 上下文 public


【C#】.net core 6.0 通过依赖注入注册和使用上下文服务_请求上下文

给自己一个目标,然后坚持一段时间,总会有收获和感悟!
请求上下文是指在 Web 应用程序中处理请求时,包含有关当前请求的各种信息的对象。这些信息包括请求的头部、身体、查询字符串、路由数据、用户身份验证信息以及其他与请求相关的数据。


目录

  • 一、DbContext
  • 1.1、创建自定义类
  • 1.2、注册服务
  • 1.3、引用
  • 二、HttpContextAccessor
  • 2.1、Web 应用程序
  • 2.2、控制台应用程序
  • 2.3、依赖注入和使用
  • 三、两者区别


一、DbContext

DbContext 是 Entity Framework (EF) 中的一个关键组件,用于在应用程序和数据库之间进行交互。它是一个上下文类,继承自 DbContext,用于定义数据库模型和执行数据库操作。通过 DbContext,您可以执行查询、插入、更新和删除等数据库操作。DbContext 主要关注数据持久化和数据访问。

在 .NET Core 6.0 中,您可以通过依赖注入 (DI) 来注册和使用上下文服务。
以下是一些常见的步骤:

1.1、创建自定义类

首先,在您的应用程序中创建一个上下文类。这个类通常是从 DbContext 类继承而来,用于定义您的数据库模型和执行数据库操作。

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }

    public DbSet<SomeEntity> SomeEntities { get; set; }

    // 其他模型和数据库操作
}

1.2、注册服务

接下来,在您的应用程序的 Startup.cs 文件中,注册您的上下文服务。在 ConfigureServices 方法中使用 AddDbContext 方法来添加上下文服务并指定连接字符串和其他选项。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<MyDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        
    // 其他服务注册
}

请确保在 appsettings.json 文件中配置了数据库连接字符串,并将其与注册的名称(DefaultConnection)对应。

1.3、引用

现在,您可以在您的应用程序的其他组件(如控制器或服务)中使用上下文服务。只需将 MyDbContext 类注入为依赖项即可。

public class MyService
{
    private readonly MyDbContext _dbContext;

    public MyService(MyDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public void DoSomething()
    {
        // 使用上下文执行数据库操作
    }
}

在上面的示例中,MyService 类依赖于 MyDbContext,通过构造函数注入该依赖项。

这样,在整个应用程序中,您都可以使用上下文服务来执行数据库操作,通过依赖注入的方式访问您的上下文对象。

请注意,上述代码片段为常见的用例提供了示例,但实际的实现可能会因您的应用程序需求而不同。

二、HttpContextAccessor

在 .NET Core 6.0 中,获取上下文的方式取决于您使用的技术栈和具体的应用程序类型。
以下是几种常见的方法:

2.1、Web 应用程序

ASP.NET Core Web 应用程序:如果您正在开发一个 ASP.NET Core Web 应用程序,您可以通过依赖注入来获取当前的 HTTP 上下文。您可以使用 HttpContextAccessor 类来访问当前的 HTTP 上下文对象。在您的控制器、中间件或服务中注入 IHttpContextAccessor,然后使用它来访问当前的上下文。

public class MyController : Controller
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public MyController(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public IActionResult MyAction()
    {
        HttpContext context = _httpContextAccessor.HttpContext;
        // 使用上下文对象进行操作
        return View();
    }
}

2.2、控制台应用程序

如果您正在开发一个控制台应用程序,您可以使用 CallContext 类来存储和检索上下文信息。CallContext 类提供了一个字典,您可以将相关上下文信息存储在其中。

public static class MyContext
{
    private static readonly string Key = "MyContextKey";

    public static string Current
    {
        get => (string)CallContext.LogicalGetData(Key);
        set => CallContext.LogicalSetData(Key, value);
    }
}

在您的应用程序中,可以设置和获取上下文信息:

MyContext.Current = "MyContextValue";
string currentContext = MyContext.Current;

这样,在应用程序的不同位置,您都可以获取和设置相同的上下文信息。

请注意,上述方法为常见的用例提供了示例,但具体的实现可能会根据您的应用程序的需求而有所不同。

2.3、依赖注入和使用

在 .NET Core 6.0 中,您可以使用依赖注入 (DI) 来注册和使用 IHttpContextAccessor

注册 IHttpContextAccessor 的步骤如下:

  1. 打开您的应用程序的 Startup.cs 文件。
  2. ConfigureServices 方法中,添加 services.AddHttpContextAccessor()
public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();

    // 其他服务注册
}

现在,IHttpContextAccessor 已经被注册到应用程序的 DI 容器中,可以在其他组件中使用。

使用 IHttpContextAccessor 的步骤如下:

  1. 在要使用 IHttpContextAccessor 的类中,将其注入为依赖项。
public class MyService
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public MyService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void DoSomething()
    {
        HttpContext context = _httpContextAccessor.HttpContext;

        // 使用 HttpContext 进行操作,例如获取请求信息或用户身份验证状态等
    }
}

在上面的示例中,我们通过构造函数将 IHttpContextAccessor 注入到 MyService 类中,并将其赋值给私有字段 _httpContextAccessor

  1. 在带有 DI 的情况下使用 IHttpContextAccessor
public void MyController(IHttpContextAccessor httpContextAccessor)
{
    HttpContext context = httpContextAccessor.HttpContext;

    // 使用 HttpContext 进行操作,例如获取请求信息或用户身份验证状态等
}

在控制器或其他类中,您可以通过方法参数直接使用 IHttpContextAccessor

通过使用 IHttpContextAccessor,您可以在应用程序的各个部分获取当前 HTTP 请求的上下文信息,例如请求头、查询参数、用户身份验证和授权信息等。请注意,您可能需要在 ASP.NET Core 应用程序中启用相关中间件和功能,以便在 IHttpContextAccessor 中获取到完整的上下文信息。

三、两者区别

DbContextIHttpContextAccessor 是在不同上下文中使用的两个不同的服务。

1)DbContext 是 Entity Framework (EF) 中的一个关键组件,用于在应用程序和数据库之间进行交互。它是一个上下文类,继承自 DbContext,用于定义数据库模型和执行数据库操作。通过 DbContext,您可以执行查询、插入、更新和删除等数据库操作。DbContext 主要关注数据持久化和数据访问。

2)IHttpContextAccessor 是 ASP.NET Core 中的一个服务,用于访问当前 HTTP 请求的上下文信息。它提供了访问请求头、查询参数、用户身份验证和授权信息等的能力。通过 IHttpContextAccessor,您可以在整个应用程序中访问当前 HTTP 请求的上下文信息。 IHttpContextAccessor 主要与 Web 请求处理相关联。

总结起来,DbContext 是与数据库交互的组件,而 IHttpContextAccessor 是与处理 Web 请求相关的组件。它们的用途和职责不同,但它们在 ASP.NET Core 应用程序中可以一起使用,以实现与数据库的交互和对 Web 请求上下文的访问。


标签:core,httpContextAccessor,IHttpContextAccessor,C#,数据库,应用程序,6.0,上下文,public
From: https://blog.51cto.com/u_15288318/8964217

相关文章

  • 推荐给程序员的chrome扩展插件:gitzip for github下载单个GitHub仓库中的文件;json-hand
    推荐清单gitzipforgithub下载单个GitHub仓库中的文件双击文件,勾选文件前面的复选框,可以一次性选择多个文件json-handle格式化json......
  • Python:diskcache实现基于文件的数据缓存
    diskcache是一个基于Sqlite文件的数据缓存如果在不想使用redis作为缓存的情况下,可以使用diskcache替代,减少对redis的依赖文档https://grantjenks.com/docs/diskcache/https://github.com/grantjenks/python-diskcachehttps://pypi.org/project/diskcache/安装pipinstall......
  • 重庆合才化工科技有限公司选购HS-DSC-101A差示扫描量热仪
    重庆合才化工科技有限公司生产研发基地坐落于重庆潼南高新区工业园区,公司专注于化学改性米糠蜡系列、蒙旦蜡系列、聚乙烯蜡系列。重庆合才化工科技有限公司重庆合才化工科技有限公司一直以来都致力于推动科技创新和实验设备升级,为了进一步提升产品质量和研发效率,近日,公司决定选购一......
  • Cnas认证路上你关心的那些个问题
    1只申请了CNAS没有申请CMA对外出报告合规吗答:看报告用途,检验检测机构资格认定管理办法当中有明确的说明,在中华人民共和国境内同时向社会出具具有证明作用的数据和结果的检测活动应当遵守本办法,也就是必须要取得CMA的资质认定,这是一条强制性要求,CNAS实验室认可的申请范围比CMA的资质......
  • python 把包含uincode字符串变成中文
    1defget_info_by_pattern(text,pattern):2p=re.compile(pattern)3p_res=p.findall(text)4returnp_res56#把包含uincode字符串变成中文7defunicode_to_chinese(text):8pattern_unicode='u[0-9a-z]{4}'9p_res=get_i......
  • 文心一言 VS 讯飞星火 VS chatgpt (164)-- 算法导论13.1 4题
    四、用go语言,假设将一棵红黑树的每一个红结点“吸收”到它的黑色父结点中,使得红结点的子结点变成黑色父结点的子结点(忽略关键字的变化)。当一个黑结点的所有红色子结点都被吸收后,它可能的度为多少?所得的树的叶结点深度如何?文心一言:红黑树是一种自平衡的二叉查找树,其节点颜色可以......
  • MYSQL varchar和nvarchar一些学习
    MYSQLvarchar和nvarchar一些学习背景先试用utfmb3的格式进行一下简单验证注意脚本都是一样的.createdatabasezhaobsh;usezhaobsh;createtablezhaobsh(zhaobshvarcharvarchar(30),zhaobshnvarcharnvarchar(30));insertintozhaobshvalues('123abc','1......
  • Typescript中的never类型
    在TypeScript中,never类型表示那些永远不会发生的类型。它通常用来表示以下情况:函数的返回类型:如果一个函数永远不会返回(例如抛出异常或进入无限循环),可以将其返回类型标注为never。functionthrowError(message:string):never{thrownewError(message);}function......
  • OS-MacOS-MacBook Pro 的电源管理 + 强行切换独立 或 集成显卡的 gpuswitch 选项;
    电源管理和强行切换显卡的办法,这里说明:(0)当前电源管理状态:pmset-ggpuswitch选项的对应值:0是集成显卡,1是独立显卡,2是自动切换(1)强制使用集成显卡:sudopmset-aGPUSwitch0(2)强制使用独立显卡:sudopmset-aGPUSwitch1(3)自动切换显卡:sudopmset-aGPUSwitc......
  • docker-ce aliyun ssl 证书失效问题
    这个问题是由于您的DockerCE稳定版仓库的SSL证书验证失败导致的。您可以尝试以下解决方法:1.更新证书:从错误信息中可以看出证书无法通过验证。您可以尝试更新证书,以确保yum可以验证SSL证书。```bashsudoyumupdate-yca-certificates```2.修改仓库地址:尝试修改docker-ce-st......