asp.net - ASP.NET MVC 5 中的 Actionfilter 注入(inject)

标签 asp.net asp.net-mvc dependency-injection inversion-of-control ninject

我有一个简单的过滤器。

public class IsAdmin : ActionFilterAttribute, IAuthenticationFilter
{
    private string _roleName;
    IBusinessIdentity _identity;

    public IsAdmin(string roleName, IBusinessIdentity identity)
    {
        this._roleName = roleName;
        this._identity = identity;
    }

    public void OnAuthentication(AuthenticationContext filterContext)
    {
    }

    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {
        if (!_identity.Roles.Contains(_roleName))
            filterContext.Result = new HttpUnauthorizedResult();
    }
}

我正在使用 Ninject。这是我的 Controller 。我正在尝试将注入(inject)的服务放入我的 ActionFilter 中,以便不依赖于 HttpContext,而是依赖于我的 IBusinessIdentity

IBusinessIdentity 被注入(inject) HttpContext.User.Identity`。它执行一些数据库调用并获取 userRoles。

public class HomeController : Controller
{
    readonly IBusinessIdentity _identity;

    public HomeController(IBusinessIdentity identity)
    {
        this._identity= identity;
    }

    [IsAdmin("Admin", _identity)]
    public ActionResult Index()
    {
        return View();  
    }
}

这不起作用,当我尝试在编译时将“身份”放入 actionfilter 构造函数中时,出现编译器错误。

An object reference is required for the non-static field, method, or property

我需要这个,因为我计划使用该身份测试各种权限。

我正在考虑在 Controller 实例化后进行某种反射。我对如何做到这一点有一个非常模糊的想法。

我使用的是 ASP.NET MVC 5,但没有 kernel.bindfilter。我无法使用旧版本。

我很清楚这个黑客行为。

Action filter constructor being called repeatedly for single controller

https://github.com/ninject/Ninject.Web.Mvc/wiki/Conditional-bindings-for-filters

如何使用 MVC 5 的 Ninject 实现相同的效果。

编辑:大规模失败

我忘了包括:

using Ninject.Web.Mvc.FilterBindingSyntax;

现在一切正常,如上面链接中所述。

现在我需要弄清楚如何在过滤器构造函数中注入(inject)“roleName”字符串。虽然我认为只是为每个角色构建一个过滤器。我稍后会发布完整的代码。

最佳答案

虽然你的问题不同,但答案与 this one 完全相同.

DI 友好属性不应定义任何行为。您需要将行为分离到一个单独的过滤器中,该过滤器可以在应用程序启动时注入(inject)其依赖项。这可以通过将操作过滤器属性分成两部分来完成。

  1. 不包含用于标记 Controller 和操作方法的行为的属性。
  2. 一个 DI 友好的类,实现 IActionFilter和/或IAuthenticationFilter其中包含所需的行为以及用于检查属性的扫描实现。

不要让 Microsoft 的 ActionFilterAttribute 营销欺骗了您。这种方法完全反对 DI。

关于asp.net - ASP.NET MVC 5 中的 Actionfilter 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28793193/

相关文章:

java - 使用 Guice 延迟绑定(bind)到实例

c# - 当返回类型为 IHttpActionResult 时,Web API 2 返回不带引号的简单字符串

c# - 如何在 sql 数据库的 asp.net 网页中显示 JSON 输出

asp.net-mvc - 如何使用 Autofac 确保每个请求有一个 NHibernate ISession?

c# - 直接引用 Razor 类库程序集

asp.net-mvc - ASP NET MVC : Dynamically adding or removing inputs on the form - unobtrusive validation

java - 为什么多个实现不允许在 module-info.java 中声明为模块服务?

javascript - 添加一个额外的单词来添加我所有的网址

asp.net - 将自定义参数发送到用户控件 ascx

asp.net-mvc - Html.Hidden 字段未设置