繁体   English   中英

C#:将数据从 Controller 传递到应用层到 DBContext 层

[英]C#: Pass Data from Controller to Application Layer to DBContext Layer

我想将全局自定义数据从 API 级别传递到应用程序服务、存储库和数据库上下文层,而不在每个方法中使用参数。

1) 一种方法是HttpContextAccessor

好奇 Net Core 中是否嵌入了任何其他全局参数,或者这是唯一已知的策略? 我们正在传递可审计数据、CreateBy、ModifiedDate,但可能会扩展它的其他属性。 我们有 100 多个 API、应用程序方法、存储库,并试图防止传递参数。

_httpContextAccessor.HttpContext.Items["TestKey"] = "SampleData";

数据库上下文:

public class AuditableDbContext: DbContext
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public AuditableDbContext(DbContextOptions<AuditableDbContext> options, IHttpContextAccessor httpContextAccessor)
        : base(options)
    {
        _httpContextAccessor = httpContextAccessor;
    }

自定义数据根据应用程序行为和用户交互而变化。

跨多个层使用上下文感知对象的一个问题是对该上下文的依赖性。 从长远来看,这使得理解代码变得非常困难,最重要的是,它使得单元测试变得更加困难。

想象一下,您依赖来自另一层的 controller 的 HttpContext 项。 该层的单元测试现在必须模仿 controller 并在上下文中设置项目以生成正确的 state。

到处传递多个参数也很糟糕,这是真的。 解决它的一种方法是使用简单的 Poco object 来存储 state 并传递它,这将使单元测试变得简单,并减少所有层中方法的参数数量。

public class RequestState
{
  public User CreateBy { get; }
  ...
}

controller 将启动 state object 并且所有层都将使用它...

另一种方法是依赖 DI 框架并使用作用域生命周期 object 注入所有层,然后您可以滥用这些层来存储 state 信息。 这与 http 上下文非常相似,但至少它是你自己的事情,你可以用它做任何你想做的事情,还可以添加强类型属性而不是 Items 集合。

在您的启动中,您将注入具有作用域生命周期的 scope object。 您将 object 注入 controller 和所有其他类(仅当这些类也是作用域或瞬态时才有效)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM