Как преобразовать Ninject Filter\Attribute-Binding в Autofac?

У меня есть атрибуты фильтра MVC и WebAPI с параметрами, которые должны поднять некоторые фильтры действий. Сейчас мы переходим на autofac, и мне нужно преобразовать DI-Definition.

В Ninject у меня есть что-то вроде этого:

Kernel.BindFilter<ShopAuthorizationMVCFilter>(System.Web.Mvc.FilterScope.Controller, 0)
    .WhenControllerHas<ShopAuthorizationMVC>()
    .InRequestScope()
    .WithConstructorArgumentFromControllerAttribute<ShopAuthorizationMVC>("rechte", o => o.Rechte);

Я могу украсить действия и контроллеры следующим образом:

[ShopAuthorizationMVC(RightsEnum.CanAccessMycontroller)]
public class MyController : Controller {}

Это прекрасно работает с Ninject, но я совершенно не представляю, как написать это в Auotofac.

Что у меня есть до сих пор:

builder.Register(c => 
    new ShopAuthorizationMVCFilter(c.Resolve<IAuthClass>(), default(RightsEnum[])))
    .AsActionFilterFor<Controller>()
    .InstancePerRequest();

Но я не знаю, как а) применить это правило только к контроллерам (и\или действиям) с моим атрибутом фильтра и б) передать параметры.


person Weissvonnix    schedule 08.02.2016    source источник
comment
Привет, ты когда-нибудь находил решение этой проблемы?! у меня точно такая же проблема в проекте, над которым я сейчас работаю, и ищу, как могу, я просто не могу найти решение...   -  person jakewilliamson    schedule 18.05.2018
comment
К сожалению нет, извините   -  person Weissvonnix    schedule 18.05.2018


Ответы (1)


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

мой исходный атрибут выглядел так:

public class MyAttribute : Attribute { }

public class MyFilter : ActionFilterAttribute
{
    private readonly MyService _myService;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (_myService.IsSomething())
        {
            return;
        }

        filterContext.Result = new RedirectResult("/my-url/");
    }
}

и был подключен в ninject как:

kernel.BindFilter<MyFilter>(FilterScope.Action, 0).WhenActionMethodHas<MyAttribute>();

после небольшого эксперимента я изменил атрибут на это:

public class MyAttribute : ActionFilterAttribute
{
    public MyService MyService { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (MyService.IsSomething())
        {
            return;
        }

        filterContext.Result = new RedirectResult("/my-url/");
    }
}

и добавил это в настройку autofac:

builder.RegisterFilterProvider();
builder.RegisterType<MyAttribute>().PropertiesAutowired();

Все идет нормально! теперь код работает только с результатами действий, украшенными атрибутом:

[MyAttribute]
public ActionResult Index() {}

мне еще нужно кое-что выяснить, а именно порядок применения атрибутов (в ninject это был порядок, в котором они были связаны при запуске) и как передать свойства вниз, но это похоже на то, что это в правильном направлении .

person jakewilliamson    schedule 19.05.2018