Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 在服务层中使用IHttpcontextAccessor合适吗?_Asp.net Core_.net Core_Asp.net Core Webapi_Service Layer - Fatal编程技术网

Asp.net core 在服务层中使用IHttpcontextAccessor合适吗?

Asp.net core 在服务层中使用IHttpcontextAccessor合适吗?,asp.net-core,.net-core,asp.net-core-webapi,service-layer,Asp.net Core,.net Core,Asp.net Core Webapi,Service Layer,我在may.net核心web应用程序中有多个层。所以他们两个是, App.WebApi 应用程序服务 服务需要检查用户的角色或名称声明。因此,我认为我可以通过App.Services层中的依赖注入来使用IHttpcontextAccessor接口。我使用扩展方法来获得如下用户声明 public static class ClaimsPrincipalExtensions { public static string GetUserEmail(this ClaimsPrincipal

我在may.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();
        ....
    }
}
公共类ProductService:IPProductService{
IHttpcontextAccessor上下文;
公共产品服务(IHttpcontextAccessor上下文){
上下文=上下文;
}
....
....
公共IEnumerable Get(){
var userRoles=context.HttpContext.User.GetUserEmail();
....
}
}

因此,我在服务层中使用了
IHttpcontextAccessor
。但它是web api的一部分。这是否适用于专业解决方案?或者还有其他方法吗?

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

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

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

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

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

Jason Taylor的Clean架构模板就是一个很好的例子,其中定义了一个
ICurrentUserService
接口,并驻留了具体的实现

这还使用了
IHttpContextAccessor
来提取有关登录用户的信息,因此这似乎是一个很好的示例

有用的参考资料 我知道在这里链接YouTube视频是不习惯的,但你的主要专业领域似乎不是ASP.NET核心,所以我建议Jimmy Bogard和Jason Taylor发表这篇演讲。它们描述了一种使用ASP.NET内核的非常现代的方式,可以缓解开发人员在以后的项目中遇到的许多结构性问题。当然,这也不是一颗灵丹妙药;对于简单的CRUD应用程序,开销可能不值得


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