Как разрешить зависимость внутри AuthorizeAttribute с помощью WebApi и Ninject

Моя текущая настройка использует Ninject для простого IoC, все идет нормально, но я не могу разрешить один из классов, которые мне нужны, внутри моего AuthorizeAttribute. Мне нужно получить доступ к классу, который выполняет ClaimsVerification:

Вот мой код:

Конфигурация ИОК:

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

person Rui Marinho    schedule 26.09.2012    source источник


Ответы (2)


Да, извините, проблема заключалась в том, чтобы внедрить iClaimsverification, который не работает в веб-API.

Я пробовал с общедоступной собственностью, и все же это не сработало.

bindfilter закомментирован, потому что он не существует в ядре NInject api (dll), он существует в dll MVC ninject, но он работает для фильтров действий в веб-mvc, а не в api mvc для чего я могу сказать..

Я решил проблему следующим образом, хотя мне не нравится многое из этого исправления:

 private IClaimsVerification verifier
    {
        get
        {
            return (GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IClaimsVerification)) as IClaimsVerification);
        }
    }
person Rui Marinho    schedule 28.09.2012
comment
Вероятно, лучше всего указать это как ОБНОВЛЕНИЕ в вашем вопросе. - person Ruben Bartelink; 28.09.2012
comment
@Rui Marinho - Эй, лучший способ найден? - person chobo2; 22.05.2013

Свойство, которое вы отметили Inject, является частным — вам нужно инициализировать Ninject с пользовательской конфигурацией, чтобы выбрать гораздо менее эффективный процесс.

(Вы не указали проблему в своем вопросе. Я вижу, вы пробовали BindFilter, но он закомментирован (почему?) - это правильный подход. Я рекомендую прочитать вики-статью Ninject.MVC3 о BindFilter для примера)

person Ruben Bartelink    schedule 26.09.2012
comment
Да, извините, проблема заключалась в том, чтобы внедрить iClaimsverification, который не работает в веб-API. Я пробовал с общедоступным свойством, и все равно это не сработало. bindfilter закомментирован, потому что он не существует в ядре NInject api (dll), он существует в dll MVC ninject, но работает для фильтров действий в веб-mvc - person Rui Marinho; 28.09.2012
comment
Есть проблема, один или два запроса на включение и расширенное обсуждение на Ninject GitHub. Вики Ninject.MVC3 ссылается на один подход, который работает, но он не касается непосредственно управления фильтрами. - person Ruben Bartelink; 28.09.2012