在服务层使用IHttpcontextAccessor合适吗?

Is it appropriate to use IHttpcontextAccessor in service layer?

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

服务需要检查用户的角色或名称声明。所以我想我可以通过 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。但它是网络的一部分 api。这适用于专业解决方案吗?或者还有其他方法吗?

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

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

所以,从这个意义上说,它可以被看作是'appropriate',只要它不妨碍你完成一个重要的项目需求,例如能够独立运行应用核心API.

但是如果您想以一种体面和现代的方式构建您的解决方案,避免这样做是有道理的。

直接的解决方案

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

Jason Taylor 的 Clean Architecture Template 就是一个很好的例子,您在其中定义了一个 ICurrentUserService 接口 in the Application layer, with the concrete implementation residing in the WebUI layer

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

有用的参考资料

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


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