如何使用WebApi和Ninject解决AuthorizeAttribute内的依赖关系

时间:2012-09-26 14:32:54

标签: authorization ninject asp.net-web-api

我目前的设置是使用Ninject进行简单的IoC,一切都很顺利,但是我无法在AuthorizeAttribute内解析我需要的其中一个类。我需要访问一个执行ClaimsVerification的类:

这是我的代码:

IoC配置:

        var kernel = new StandardKernel(); // Ninject IoC
        // These registrations are "per instance request".
        // See http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/

        kernel.Bind<RepositoryFactories>().To<RepositoryFactories>()
            .InSingletonScope();

        kernel.Bind<IRepositoryProvider>().To<RepositoryProvider>();
        kernel.Bind<ISmartDocumentorUow>().To<SmartDocumentorUow>();
        kernel.Bind<IClaimsVerification>().To<ClaimsVerification>();
       // kernel
        //kernel.BindFilter<MyAuthorizeAttribute>(FilterScope.Controller, 0).WhenControllerHas<RequireRolesAttribute>();

        // Tell WebApi how to use our Ninject IoC
        config.DependencyResolver = new NinjectDependencyResolver(kernel);

MyAuthorizeAttribute:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    [Inject]
    IClaimsVerification clamisverify { get; set; }

    public MyAuthorizeAttribute()
    {
        //var x = System.Web.Mvc.DependencyResolver.Current.(typeof(IClaimsVerification));
    }

2 个答案:

答案 0 :(得分:1)

对不起,问题是注入了无法在web api中运行的iClaimsverification。

我尝试使用公共财产,但仍无效。

bindfilter被注释掉,因为它在核心NInject api(dll)中不存在,它确实存在于ninject的MVC dll中,但它适用于web mvc中的Action过滤器,而不适用于api mvc我可以告诉你......

我确实解决了这个问题,虽然我不喜欢这个问题很多:

 private IClaimsVerification verifier
    {
        get
        {
            return (GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IClaimsVerification)) as IClaimsVerification);
        }
    }

答案 1 :(得分:0)

您标有Inject的属性是私有的 - 您需要使用自定义配置初始化Ninject,以选择进入效率低得多的流程

(你没有在你的问题中陈述问题。我看到你正在尝试BindFilter,但是它被注释掉了(为什么?) - 这是正确的方法。我建议你阅读BindFilter上的Ninject.MVC3 wiki文章作为例子)