0

我们正在使用 Autofac 的 IAutofacAuthorizationFilter 构建授权过滤器,我们已经在启动时使用我们的基本控制器注册了这个过滤器。所有控制器都继承自我们的基本控制器。我们在执行过程中需要确定目标控制器是否已向 CustomAuthFilter 注册。我尝试使用反射来检查控制器是否注册了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();
4

1 回答 1

1

这种方法使用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));

 });
于 2018-10-24T13:00:29.877 回答