gpt4 book ai didi

c# - 将 IHttpContextAccessor 注入(inject) Controller 操作中的绑定(bind)模型

转载 作者:行者123 更新时间:2023-11-30 20:33:18 25 4
gpt4 key购买 nike

我有一个 Controller 操作方法:

public void Register([FromBody]RegisterTenantCommand message)
{
...
}

我有 RegisterTenantCommand 类和构造函数:

public class RegisterTenantCommand
{
public RegisterTenantCommand(IHttpContextAccessor httpContextAccessor)
: base(httpContextAccessor) { }
}

但是当我启动我的应用程序并执行此操作时,我有 httpContextAccessor = null

我该如何解决?

最佳答案

似乎您将命令与来自 UI 框架的命令混淆了(例如 ICommand 接口(interface)的 WPF+MVVM 实现)。

当前的实现也有点违反 SRP 原则,即一个类应该只负责一件事。您基本上是在处理输入(将其绑定(bind)到用户值)并执行它以及处理其中的执行逻辑。

Command/Handler 或 CQRS 模式中的命令仅仅是消息,它们只包含数据(可能会也可能不会被序列化并通过消息总线发送以供其他后台进程处理)。

// ICommand is a marker interface, not to be confused with ICommand from WPF
public class RegisterTenantCommand : ICommand
{
public string TenantId { get; set; }
public string Name { get; set; }
}

命令处理程序由标记接口(interface)及其实现组成(1:1 关系,1 个命令对应 1 个处理程序)。

public interface ICommandHandler<T> where T : ICommand
{
void Handle(T command);
}

public class RegisterTenantCommandHandler : ICommandHandler<RegisterTenantCommand>
{
private readonly IHttpContext context;

// You should really abstract this into a service/facade which hides
// away the dependency on HttpContext
public RegisterTenantCommandHandler(IHttpContextAccessor contextAccessor)
{
this.context = contextAccesspor.HttpContext;
}

public void Handle(RegisterTenantCommand command)
{
// Handle your command here
}
}

一旦使用像 Autofac 这样的第 3 方 IoC 自动注册或使用内置 IoC 手动注册(这里我将使用内置):

services.AddTransient<ICommandHandler<RegisterTenantCommand>, RegisterTenantCommandHandler>();

您可以在操作或 Controller 或任何其他服务中注入(inject)它:

public class TenantController 
{
public TenantController(ICommandHandler<RegisterTenantCommand> registerTenantHandler)
{
...
}
}

或行动

public Task<IActionResult> RegisterTenant(
[FromBody]RegisterTenantCommand command,
[FromService]ICommandHandler<RegisterTenantCommand> registerTenantHandler
)
{
registerTenantHandler.Handle(command);
}

当然,您可以进一步抽象它,只注入(inject)一个接口(interface)类,它将解析和处理所有命令,然后调用它 generalCommandHandler.Handle(command) ,它的实现将解析和处理它。

关于c# - 将 IHttpContextAccessor 注入(inject) Controller 操作中的绑定(bind)模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40338470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com