【问题标题】:C#: Pass Data from Controller to Application Layer to DBContext LayerC#:将数据从控制器传递到应用程序层到 DBContext 层
【发布时间】:2020-04-29 22:33:48
【问题描述】:

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

1) 一种方法是HttpContextAccessor

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

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

DBContext:

public class AuditableDbContext: DbContext
{
    private readonly IHttpContextAccessor _httpContextAccessor;

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

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

【问题讨论】:

  • 您希望传递给应用程序的数据是静态的,还是会根据应用程序行为或用户交互而改变?
  • 嗨@NikP 正确,它会根据应用程序行为和用户交互而变化
  • 请参阅@MichaC 对此的回答,这正是我要表达的意思,但他打字速度更快。全局状态通常不好,可能会导致一些非常令人沮丧的错误和不可预测的行为,并将所有内容耦合在一起。他是对的,跟随他的领导。
  • @NikP 这是个好策略吗? stackoverflow.com/questions/36401026/…
  • 这真的取决于你的应用需求。我仍然认为您最好使用下面的答案,并使用一些智能多态性来改变这里和那里的行为。如果您只是涉及大量层并且它是站不住脚的,请考虑一下。你可能不需要那么多层,但你可能确实需要。请注意那些实际上什么都不做的层,只是将信息从上层传递到下层,反之亦然。如果没有代表重要、有用且一致的抽象层,我通常会尝试消除它。

标签: c# .net entity-framework asp.net-core .net-core


【解决方案1】:

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

想象一下,您依赖来自另一层控制器的 HttpContext 项。该层的单元测试现在必须模仿控制器并将项目设置在上下文中以产生正确的状态。

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

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

控制器将启动状态对象,所有层都将使用它...

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

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

【讨论】:

  • 您能否给我发送示例代码或参考/url,了解如何实现 1) 'poco' 或 2) 'state object' 我可以传递给所有层?,我想了解更多这可能是一个教程或其他东西,谢谢
  • 我们有 100 多个 api、应用程序方法、存储库,并试图防止传递参数。希望这种策略可以避免这种情况?
  • 这会是一个好的策略吗? stackoverflow.com/questions/36401026/…
猜你喜欢
  • 1970-01-01
  • 2019-05-26
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
相关资源
最近更新 更多