Есть ли способ узнать, зарегистрирован ли контроллер с IAutofacAuthorizationFilter - PullRequest
0 голосов
/ 24 октября 2018

Мы создаем фильтр авторизации, используя IAutofacAuthorizationFilter от Autofac, мы зарегистрировали этот фильтр при запуске с нашим базовым контроллером.Все контроллеры наследуются от нашего базового контроллера.В нашем исполнении есть требование определить, зарегистрирован ли целевой контроллер в CustomAuthFilter.Я попытался с помощью Reflection, чтобы проверить, зарегистрирован ли контроллер CustomAuthFilter, я не могу получить.Есть ли лучший способ проверить, зарегистрирован ли контроллер в CustomAuthFilter.

 builder.RegisterType<CustomAuthFilter>()
            .Named<IAutofacAuthorizationFilter>("CustomAuthFilter")
            .WithParameters(new[]
                {
                    new ResolvedParameter((pi, ctx) => pi.ParameterType == typeof(Logger),
                        (pi, ctx) => ctx.Resolve<Logger>()),
                    new ResolvedParameter((pi, ctx) => pi.ParameterType == typeof(Reader),
                        (pi, ctx) => ctx.Resolve<Reader>())
                }
               ).AsWebApiAuthorizationFilterFor<ControllerBaseAPI>()
            .InstancePerRequest();

1 Ответ

0 голосов
/ 24 октября 2018

Этот подход использует событие RegisterBuildCallback для фильтрации регистраций.Он также использует рефлексию, потому что типы метаданных отсутствуют во время компиляции, или я не могу найти.Вы можете потратить некоторое время на уточнение выбора, но это место, где информация хранится в контейнере.

 builder.RegisterBuildCallback(builtContainer =>
 {
            //Contains all controller registered with AutofacWebApiAuthorizationFilter
            var registeredWithFilter = builtContainer.ComponentRegistry.Registrations.SelectMany(x => x.Metadata).Where(x => x.Key.Equals("AutofacWebApiAuthorizationFilter"))
                                                                        .Select(x => x.Value).Select(x => x.GetType().GetProperty("ControllerType").GetValue(x))
                                                                        .Select(x => x.GetType().GetProperty("Name").GetValue(x));

 });
...