我有一个.NET 6 API,我想在mediatr命令中获取HttpContext,我在docs上读到可以用builder.Services.AddHttpContextAccessor();注册HttpContextAccessor,我没有任何问题,但是当我想在命令的构造函数中注入IHttpContextAccessor时,我的IDE告诉它无法解析符号.我也看了其他多个来源,他们大多指向microsoft.aspnetcore.httpmicrosoft.aspnetcore.app要安装.可悲的是,这些nuget包被弃用,所以我正在寻找一个解决方案,不使用这些.

PS:API和Mediatr命令不在同一项目中

我已经在多个其他网站上寻找答案,但他们要么没有指定他们正在使用的软件包,要么他们使用一个过时的软件包.

推荐答案

若要在非web.sdk项目中使用ASP.NET Core 3+类型,请使用shared framework reference.

示例项目:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net6.0</TargetFrameworks>
    <Nullable>enable</Nullable>
    <OutputType>Library</OutputType>
  </PropertyGroup>

  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

</Project>

然而,请注意,这主要是为了为库提供端点等.在业务层使用此引用可以将业务逻辑与Web API框架结合起来.

更灵活的方法是为业务逻辑项目中所需的功能提供接口,并在API项目中提供实现.

举个例子

// In business project
public interface IMySpecialContext
{
    string Value { get; }
}
// In API project
public class HttpMySpecialContext : IMySpecialContext
{
    private readonly IHttpContextAccessor _httpContextAccessor;

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

    public string Value
    {
        // Probably should throw for missing HttpContext or header.
        get => _httpContextAccessor.HttpContext?.Request.Headers["X-My-Special-Header"]!;
    }
}
// In unit tests
public class DummyMySpecialContext : IMySpecialContext
{
    public string Value => "Dummy Special Context Value";
}

Csharp相关问答推荐

亚马逊Pinpoint C# SDK

ASP.NET Core:如何在IPageFilter中注入ApplicationDbContext

使用Audit.EntityFramework,我如何将外键的值设置为相关实体上的属性?

使页面内容居中

有没有办法在WPF文本框中添加复制事件的处理程序?

如何忽略API JSON响应中的空字符串?

基于C#和ANGING的SignalR实时聊天流媒体应用

BFF到具有AAD/Entra ID B2C的内部API(.NET/ASP.NET核心/标识.Web)

如何在不复制或使用输出的情况下定义项目依赖

.Net MAUI,在将FlyoutPage添加到容器之前,必须设置添加构造函数导致Flyout和Detail"

MudBlazor Textfield已禁用,但其验证工作正常

匿名类型的AbstractValidator

如何在特定环境中运行dotnet测试?

序列化过程中的死循环

我应该为C#12中的主构造函数参数创建私有属性吗?

为什么在使用JsonDerivedType序列化泛型时缺少$type?

为什么我可以在注册表编辑器中更改值,但不能在以管理员身份运行的C#表单应用程序中更改?

Autofac -动态实例化:手动传递构造函数

如何在flutter dart中使用publicKey.xml文件进行rsa加密,我遇到了问题Exception:Could not parse BigInt

如何提高C#中比较大 struct 的性能?