Asp WebApi:过滤和注入依赖到构造函数参数

时间:2018-03-29 19:44:23

标签: c# asp.net asp.net-web-api dependency-injection ninject


有什么方法可以使用 ActionFilterAttribute 中的过滤器,并在构造函数中放置参数,对于WebApi,这些参数将被ninject依赖性隐藏吗?

我知道,类似的东西,对于Mvc apllication非常有用,但我不知道如何为WebApi应用程序调整它。

我通过互联网搜索一些解决方案,但任何问题都没有解决我的问题。

我能成功做什么:
- api控制器,注入依赖到构造函数
- 执行空过滤器,不带任何参数

我要做什么:
- 在涉及属于控制器的动作之前,我想在构造函数中使用参数执行过滤器,其中ninject将注入依赖性作为参数。
此过滤器由我 AccessControlFilter 命名。

下面的代码编译了,但就像我告诉的那样,尽管使用了过滤器绑定了 Kernel.BindFilter<> ,带参数的过滤器仍有未加衬垫

  

带过滤器的类

PATH=$PATH:~/bin
  

使用ninject工厂的课程

~$
  

在Global.asax.cs中调用ninject依赖项

using System.Web.Http.Controllers;
using System.Web.Http.Filters;

public class AccessControlAttribute : FilterAttribute
{

}

public class AccessControlFilter : ActionFilterAttribute
{
    public AccessControlFilter (IDataBaseContext context)
    {

    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        base.OnActionExecuting(actionContext);
    }
}
  

使用ninject依赖关系的控制器和自定义过滤器

public class NinjectFactory : System.Web.Mvc.IDependencyResolver, System.Web.Http.Dependencies.IDependencyResolver
{
    protected IKernel Kernel = null;

    public NinjectFactory()
    {
        Kernel = new StandartKernel();

        Kernel.Bind<ICompanyRepository>().To<CompanyRepository>();

        Kernel.BindFilter<AccessControlFilter>(System.Web.Mvc.FilterScope.Controller, 0)
            .WhenControllerHas<AccessControlAttribute>();
    }

    public object GetService(Type type)
    {
        return Kernel.TryGet(type);
    }

    public IEnumerable<object> GetServices(Type type)
    {
        return Kernel.GetAll(type);
    }

    public System.Web.Http.Dependencies.IDependencyScope BeginScope()
    {
        return this;
    }

    public void Dispose()
    {

    }
}

0 个答案:

没有答案