Проблема с Ninject и MVC3 Dependency Injection фильтр действий на контроллере и действия - PullRequest
3 голосов
/ 04 мая 2011

Недавно я решил удалить кучу фильтров уровня действия в контроллере и заменить их одним фильтром уровня контроллера.

Теперь я получаю это сообщение об ошибке.

Error activating LogActionFilter
More than one matching bindings are available.
Activation path:
 1) Request for LogActionFilter

Suggestions:
 1) Ensure that you have defined a binding for LogActionFilter only once.

Я уверен, что ошибка связана с двойным связыванием фильтра действий, потому что это то, что я изменил. Однако, когда я просматриваю документацию здесь , я вижу, что она определяет / делает то же самое. Так что я действительно не уверен, что делаю не так.

Мой образец контроллера

[LogAction]
public class SomeController : Controller
{
    public ActionResult SomeAction()
    { 

    }
}

мой регистрационный код

public static void RegisterFilters()
{
    Kernel.BindFilter<LogActionFilter>(FilterScope.Controller, 0)
    .WhenControllerHas<LogActionAttribute>();

    Kernel.BindFilter<LogActionFilter>(FilterScope.Action, 0)
        .WhenActionMethodHas<LogActionAttribute>();
}

Ответы [ 3 ]

4 голосов
/ 04 мая 2011

Это происходит, если ваш контроллер и одно из его действий одновременно имеют атрибут LogActionAttribute.

3 голосов
/ 11 января 2012

(я знаю, что ответ уже принят, но это ради документации.)

Если вы можете использовать только версию выпуска, временное решение - создать два подкласса и зарегистрировать их отдельно. Вот пример из моего приложения:

public class MyAuthorizationFilter : IAuthorizationFilter
{
   /* call base ctor */
}

public class MyControllerAuthorizationFilter : MyAuthorizationFilter
{
   /* call base ctor */
}

public class MyActionAuthorizationFilter : MyAuthorizationFilter
{
}

Затем настройте привязки фильтров:

this.BindFilter<MyControllerAuthorizationFilter>(FilterScope.Controller, 0)
            .WhenControllerHas<MyAttribute>()
            .WithConstructorArgumentFromControllerAttribute<ProtectedAttribute>(/*...*/) ;

this.BindFilter<MyActionAuthorizationFilter>(FilterScope.Action, 0)
            .WhenActionMethodHas<MyAttribute>()
            .WithConstructorArgumentFromActionAttribute<ProtectedAttribute>(/*...*/) ;

Убедитесь, что вы вызываете правильный метод атрибута WithConstructorArgumentFrom [ Controller / Action ], иначе вы получите ошибку «У последовательности нет элементов» (я так и сделал).

1 голос
/ 18 июля 2012

Лучший обходной путь. На самом деле я использую это и в новой версии, а не для двух привязок для контроллеров и действий.

this.BindFilter<MyFilter>(FilterScope.Global, int.MinValue)
    .When((controllerContext, actionDescriptor) =>
                                                 controllerContext
                                                .Controller
                                                .GetType()
                                                .GetCustomAttributes(typeof(MyAttribute),true)
                                                .Length > 0 
    || actionDescriptor.GetCustomAttributes(typeof(MyAttribute), true).Length > 0);
...