Asp.net core 在服务层中使用IHttpcontextAccessor合适吗?
我在may.net核心web应用程序中有多个层。所以他们两个是,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
- 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应用程序,开销可能不值得
如果您还有其他顾虑或问题,请告诉我,这样我可以让这个答案更有用