Ninject + Web API 2: ошибка при активации IFilterProvider с использованием привязки IFilterProvider к DefaultFilterProvider

Первоначально я использовал некоторый собственный код, который я нашел для обработки разрешения зависимостей в веб-API, и он работал нормально. Проблема, с которой я столкнулся, заключалась в том, что я хотел привязать фильтр к своим областям контроллера так же, как вы можете с MVC. Например, Ядро.BindFilter. Новый пакет Ninject.We.WebApi имеет расширение привязки, которое мне нужно, но как только я добавляю его в свой проект, я получаю следующую ошибку. Я не меняю свой код, просто ссылаюсь на DLL.

Ошибка при активации IFilterProvider с помощью привязки IFilterProvider к DefaultFilterProvider Обнаружена циклическая зависимость между конструкторами двух служб.

Путь активации: 3) Внедрение зависимости IFilterProvider в параметр defaultFilterProviders конструктора типа DefaultFilterProviders 2) Внедрение зависимости DefaultFilterProviders в параметр filterProviders конструктора типа DefaultFilterProvider 1) Запрос IFilterProvider

Предложения: 1) Убедитесь, что вы не объявили зависимость для IFilterProvider от каких-либо реализаций службы. 2) Рассмотрите возможность объединения сервисов в один, чтобы убрать цикл. 3) Используйте внедрение свойств вместо внедрения конструктора и реализуйте IInitializable, если вам нужно, чтобы логика инициализации выполнялась после ввода значений свойств.

в Ninject.Activation.Context.Resolve() в Ninject.KernelBase.‹>c__DisplayClass15.b__f(привязка IBinding) в System.Linq.Enumerable.WhereSelectListIterator2.MoveNext() at System.Linq.Enumerable.<CastIterator>d__b11.MoveNext() в System.Linq.Enumerable.d__142.MoveNext() at System.Collections.Generic.List1..ctor(источник IEnumerable1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 ) в Ninject.Web.WebApi.Filter.DefaultFilterProvider.GetFilters(конфигурация HttpConfiguration, дескриптор действия HttpActionDescriptor) в System.Web.Http.Controllers.HttpActionDescriptor.b__0(IFilterProvider fp) в System.Linq.Enumerable.d__142.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.OrderedEnumerable1. d__0.MoveNext() в исходном коде System.Linq.Buffer1..ctor(IEnumerable1) в System.Linq.Enumerable.d__a01.MoveNext() at System.Web.Http.Controllers.HttpActionDescriptor.<RemoveDuplicates>d__3.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.Enumerable.<ReverseIterator>d__a01.MoveNext() в коллекции System.Collections.Generic.List1..ctor(IEnumerable1)
в System.Linq.Enumerable. ToList[TSource](IEnumerable1 source) at System.Web.Http.Controllers.HttpActionDescriptor.InitializeFilterPipeline() at System.Lazy1.CreateValue() --- Конец трассировки стека из предыдущего места, где было выдано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в System.Lazy`1.get_Value() в Система.W eb.Http.Controllers.HttpActionDescriptor.GetFilterPipeline()
в System.Web.Http.Controllers.HttpActionDescriptor.GetFilterGrouping()
в System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken CancellationToken) в System .Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore (запрос HttpRequestMessage, CancellationToken CancellationToken) в System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()


person oliwa    schedule 03.06.2014    source источник


Ответы (2)


В случае, если кто-то еще ищет потенциальное решение для циклической зависимости для IFilterProvider, мне пришлось явно привязать DefaultFilterProviders, как это

k.Bind<DefaultFilterProviders>().ToConstant(new DefaultFilterProviders(GlobalConfiguration.Configuration.Services.GetFilterProviders()));

или это

k.Bind<DefaultFilterProviders>().ToSelf().WithConstructorArgument(GlobalConfiguration.Configuration.Services.GetFilterProviders());

Если кто-то еще знает лучший способ, я хотел бы услышать его.

person user3416682    schedule 02.04.2019

Я понял. Я добавил пакет Nuget Ninject.Web.WebApi.WebHost.

person oliwa    schedule 05.06.2014
comment
Не могли бы вы объяснить, как вы решили проблему? - person Roman Marusyk; 26.01.2016
comment
Конечно, я добавил в свой проект пакет Ninject.Web.WebApi.WebHost. Этот пакет не загружается автоматически, поэтому вам нужно добавить его вручную. - person oliwa; 28.01.2016
comment
Спасибо, но к сожалению мне не помогло - person Roman Marusyk; 28.01.2016
comment
И я нет. У меня все еще та же проблема. - person Ricardo França; 05.10.2016