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