【问题标题】:Is it appropriate to use IHttpcontextAccessor in service layer? [closed]在服务层使用 IHttpcontextAccessor 是否合适? [关闭]
【发布时间】:2021-06-05 17:05:15
【问题描述】:

我在可能的 .net 核心 Web 应用程序中有多个层。所以他们两个是;

  • App.WebApi
  • 应用程序服务

服务需要检查用户的角色或名称声明。所以我想我可以通过App.Services层中的依赖注入来使用IHttpcontextAccessor接口。我正在使用扩展方法来获取用户声明,如下所示。

public static class ClaimsPrincipalExtensions
{
    public static string GetUserEmail(this ClaimsPrincipal principal)
    {
        return principal.FindFirstValue(ClaimTypes.Email);
    }

    public static string GetUserId(this ClaimsPrincipal principal)
    {
        return principal.FindFirstValue(ClaimTypes.NameIdentifier);
    }
}

服务层实现如下

public class ProductService: IProductService {
    IHttpcontextAccessor context;

    public ProductService(IHttpcontextAccessor context){
       context = context;
    }
    ....
    ....
    public IEnumerable<Product> Get(){
        var userRoles = context.HttpContext.User.GetUserEmail();
        ....
    }
}

所以我在服务层使用IHttpcontextAccessor。但它是 web api 的一部分。这适合专业解决方案吗?或者有没有其他办法?

【问题讨论】:

    标签: asp.net-core .net-core asp.net-core-webapi service-layer


    【解决方案1】:

    根据我的经验,在 ASP.NET 中,开发人员往往不太担心这些隔离问题(也不担心例如贫血域)。

    在大多数系统中,尤其是较小的系统中,业务逻辑和 API 之间存在很多耦合;例如通过使用过滤器和中间件。

    因此,从这个意义上说,它可以被视为“合适的”,只要它不妨碍您满足重要的项目要求,例如能够独立于 API 运行应用程序核心。

    但是,如果您想以一种体面和现代的方式构建您的解决方案,那么避免做这样的事情是有意义的。

    简单的解决方案

    一个直接的解决方案是将给定数据提取到单独的“服务”中,并在使用给定服务的层中定义一个接口。然后在WebApi项目中实现接口。

    一个很好的例子是 Jason Taylor 的 Clean Architecture Template,其中定义了 ICurrentUserService 接口 in the Application layer,具体实现位于 in the WebUI layer

    这也使用IHttpContextAccessor 来提取有关登录用户的信息,因此这似乎是您想要做的一个很好的例子。

    有用的参考资料

    我知道在这里链接 YouTube 视频是不习惯的,但您的主要专业领域似乎不是 ASP.NET Core,所以我建议 Jimmy Bogard 的 Vertical Slice Architecture 演讲和 Clean Architecture 的演讲杰森·泰勒。他们描述了一种使用 ASP.NET Core 的非常现代的方式,可以缓解开发人员以后在项目中遇到的许多结构性问题。当然,这也不是灵丹妙药。对于简单的 CRUD 应用程序,开销可能不值得。


    如果您有其他疑虑或问题,请告诉我,这样我可以使这个答案更有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      相关资源
      最近更新 更多