1


There are any way to use filter from ActionFilterAttribute with parameters placed in constructor, which who will be inicjalized by ninject depencency for WebApi?

I know that, a something like that, will work very good for Mvc apllication, but i don't know how to adjust it for WebApi application.

I search a some solution by internet, but any not solved my issue.

What i am managed to do:
- api controller, injection dependency into constructor
- perform empty filter, without any parameters

What i am to do:
- before involve action belonging to controller, i want to perform filter with parameter in constructor, where ninject will inject depencency as parameter.
This filter is named by me AccessControlFilter.

Below code has compiled, but like as i told, despite bind of filter by using
Kernel.BindFilter<>, filter with parameters still has not lanuched.

Class with filter

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);
    }
}

class with ninject factory

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()
    {

    }
}

Calling ninject dependency in Global.asax.cs

NinjectFactory factory = new NinjectFactory();

DependencyResolver.SetResolver(factory);
GlobalConfiguration.Configuration.DependencyResolver = factory;
GlobalConfiguration.Configure(WebApiConfig.Register);

Controller using ninject dependency, and custom filter

[AccessControlAttribute]
public class CompaniesController : ApiController
{
    public CompaniesController(ICompanyRepository companyRepository)
    {

    }

    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}
neuser
  • 107
  • 13
  • this can be of some help with Ninject https://stackoverflow.com/a/48647030/1236044 – jbl Apr 03 '18 at 07:27

0 Answers0