IControllerModelConvention с внедрением зависимости - PullRequest
0 голосов
/ 26 апреля 2018

Я занимаюсь разработкой сайта с использованием ядра asp.net 2.0 MVC. Я столкнулся с ситуацией, когда я хотел бы применить разные фильтры авторизации к различным контроллерам на основе некоторой логики. Например, на всех контроллерах, начинающихся с префикса Identity, будет запускаться один фильтр авторизации, в то время как на всех других контроллерах будет запускаться другой фильтр авторизации.

Я следовал этой статье , показывая, что это можно сделать, добавив реализацию IControllerModelConvention к методу services.addMvc(options), как показано ниже, при запуске в методе ConfigureServices.

services.AddMvc(options =>
{
    options.Conventions.Add(new MyAuthorizeFiltersControllerConvention());
    options.Filters.Add(typeof(MyOtherFilterThatShouldBeAppliedGlobally));
}

А вот класс MyAuthorizeFiltersControllerConvention, где вы можете видеть, что я добавляю специальный фильтр авторизации для каждого контроллера на основе соглашения об именах.

public class AddAuthorizeFiltersControllerConvention : IControllerModelConvention
{
    public void Apply(ControllerModel controller)
    {
        if (controller.ControllerName.StartsWith("Identity"))
        {
            controller.Filters.Add(new AuthorizeFilter(...));

            // This doesn't work because controller.Filters 
            // is an IList<IFilterMetadata> rather than a FilterCollection
            controller.Filters.Add(typeof(AnotherFilter)); 
        }
        else
        {
            controller.Filters.Add(new AuthorizeFilter(...));
        }
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу добавлять фильтры таким образом, используя перегрузку typeof(filter), как при запуске в методе ConfigureServices. Я требую этого, потому что некоторые фильтры, которые я хочу добавить, требуют внедрения зависимостей для их создания.

Мой вопрос: как мне этого добиться? Это вообще возможно?

1 Ответ

0 голосов
/ 10 января 2019

Вот как вы можете это сделать:

controller.Filters.Add(new TypeFilterAttribute(typeof(AnotherFilter)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...