【问题标题】:Inject httpcontext into custom attribute outside controller in .net core将httpcontext注入.net核心控制器外部的自定义属性
【发布时间】:2019-06-11 07:55:44
【问题描述】:

我需要将 httpcontext 注入到控制器外部使用的自定义属性中。我在控制器中找到了几种解决方案,但我的情况有点棘手。现在我的 PermissionController 中有以下代码

[PermissionFilter(PermissionEnum.Permission, AccessLevelEnum.Create)] <-- it works perfectly
[HttpPost("users/{userId}")]
public async Task<IActionResult> 
  AssignPermissionToUser([FromBody] List<PermissionToVM> permissions, int userId)
{
    await _permissionService.Assign(permissions); <-- .Assign() extension
    //code goes here
}

在上面的方法中有一个扩展方法.Assign的调用。该方法代码如下。

//[SecondPermissionFilter(PermissionEnum.Permission,
   AccessLevelEnum.Create)] <-- here I check permissions but don't 
   know how to inject the httpcontext
public async Task Assign(List<PermissionToVM> permissions)
{
    //code goes here
}

正如我访问过的许多网站中提到的那样。这里https://dotnetcoretutorials.com/2017/01/05/accessing-httpcontext-asp-net-core/ 在控制器外部注入httpcontext 可以使用IHttpContextAccessor 完成。问题是我不知道如何使用它而不将它传递给构造函数。我的自定义属性应该被称为装饰器[SecondPermissionFilter(PermissionEnum.Permission, AccessLevelEnum.Create)],当只传递权限设置时,没有任何对httpcontextaccessor的引用。

这甚至可能吗?如果没有,也许还有其他方法可以做到这一点?

编辑:这是SecondPermissionFilter类的代码:

public sealed class SecondPermissionFilterAttribute : Attribute
{
    private readonly PermissionEnum _requestedPermission;
    private readonly IEnumerable<AccessLevelEnum> _accessLevelCollection;
    private readonly IHttpContextAccessor _contextAccessor; //<-- how to inject?

    public PermissionFilterAttribute(PermissionEnum requestedPermission, params AccessLevelEnum[] accessLevelCollection)
    {
        _requestedPermission = requestedPermission;
        _accessLevelCollection = accessLevelCollection;
    }
}

【问题讨论】:

  • 您最好向我们展示您的自定义属性的定义。这就是你可以注入 IHttpContextAccessor 的地方。
  • @Bellash 控制器权限属性有效,我不想修改它。代码中提到的“SecondPermissionFilter”相当简单。我在我的问题中添加了定义。

标签: asp.net-core .net-core custom-attributes httpcontext filterattribute


【解决方案1】:

你所追求的是一个叫做Property Injection的东西。根据official docs,这不是 .NET Core DI 容器开箱即用的支持。

但是,您可以使用第三方库,例如 NinjectAutofac - 两者都可以通过 NuGet 获得。

在我看来,Ninject 语法更好,然而this answer 中所述,并且this answer 属性注入本身被认为是不好的做法。所以如果可能的话,我会尽量避免。

因此,您应该改用过滤器documentationthis answer 指定的三种方法中的一种,从而进一步分解。

编辑

This answer 专门处理属性注入,second answer 看起来无需外部依赖即可实现这一目标。

【讨论】:

  • 我知道如何在控制器内部执行此操作,我需要在控制器外部的自定义属性中获取 httpContext。您提供的链接适用于控制器。但是你的解释为什么我不应该这样做我足以让我投票。谢谢
  • 抱歉,我已经编辑了我的答案以包含一些指向特定案例的链接。
猜你喜欢
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
相关资源
最近更新 更多