【问题标题】:Is it good to use AspNetCore Http dll in service layer of application在应用程序的服务层使用 AspNetCore Http dll 好不好
【发布时间】:2019-04-21 11:15:39
【问题描述】:

给你一些背景:

我创建了一个多租户 Web 应用程序。

这里,对于任何请求,都在执行以下步骤

1. Fetch the user information such as ID from HttpContext object
2. Then getting the approprate db name from a common db.
3. Updating the dbContext with the db name
4. And all my repository classes are instantiated based on this updated dbContext 

前两个步骤是在类库项目(服务层)中完成的,为了获取用户 ID,我必须访问 HttpContext 对象,手动引用 AspNetCore.Http.dll 的对象.(获取dll并复制到文件夹中并添加到项目中)

这样做的正确方法是什么?在类库项目中使用 NetCore 库是不是更好?

【问题讨论】:

  • 我通常会将来自请求的任何信息(例如 UesrID)从我的控制器传递给服务层方法。
  • 如果您需要与 UserID 一起传递其他数据怎么办?假设我需要从请求的标头中传递一些其他 ID。然后,我的所有服务方法都应该更新。
  • 没关系。你所说的实际上是一种不好的做法。您实际上是在隐藏依赖项。您的班级需要一个用户 ID 和一些标题。而不是实际制作 API 的那一部分,您只是尝试传递一些对象,该类甚至不应该知道恰好包含这些信息(以及它不需要的许多其他东西) )。如果现在只是 id,但稍后您还需要一个标头,这实际上是对您的 API 的重大更改,应该这样处理。

标签: c# asp.net-core


【解决方案1】:

目前尚不完全清楚您在这里做什么,但至于HttpContext,有几点应该对您有所帮助:

  1. 只有参考是不够的。您必须手动删除 DLL 的事实只会增加这无论如何都不起作用的可能性。 HttpContext 仅存在于请求管道的上下文中。无论您是否可以编译一些代码,如果它不在该管道中运行,HttpContext 将是 null 并且对您无用。

  2. 无论如何,库类通常不应该依赖于HttpContext 之类的东西。如果您需要库类中的用户 id 之类的东西,则应该将该用户 id 本身传递给构造函数或方法(取决于哪个最有意义)。如何从 HttpContext 获取用户 ID 的逻辑是您的班级可能不应该拥有的领域知识。

  3. 如果你打算直接使用HttpContext,你应该注入IHttpContextAccessor。这将要求您使用 services.AddHttpContextAccessor() 在 ASP.NET Core 应用程序中添加服务。完成此操作后,您就可以通过该访问器实例获取当前请求的HttpContext。但是,如果您不在请求管道之外,它仍然为空。

【讨论】:

    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多