ASP .NET Core中的自动控制器检测

时间:2019-06-22 09:39:50

标签: c# asp.net-core .net-core

Asp .net core MVC在启动时自动检测项目中的控制器。我一直在寻找一种方法来防止某些Controllers出现这种情况。结果,我发现可以实现IControllerFactory来动态滤除控制器。但是,据我了解,它是用于创建控制器而不是检测。在没有实现IControllerFactoryIControllerActivator的情况下,我还有其他方法可以这样做吗?在启动时是否还有其他涉及控制器检测的组件?

IControllerActivatorIControllerFactory使用来创建控制器。

2 个答案:

答案 0 :(得分:1)

您需要实现自己的IControllerActivator并在其中添加逻辑。

我建议向控制器添加一个属性,并在Create方法中使用反射来启用/禁用控制器

public class CustomControllerResolver : IControllerActivator
{
    public object Create(ControllerContext actionContext)
    {
        var actionDescriptor = actionContext.ActionDescriptor;
        var controllerType = actionDescriptor.ControllerTypeInfo.AsType();
        return actionContext.HttpContext.RequestServices.GetRequiredService(controllerType);
    }

    public virtual void Release(ControllerContext context, object controller)
    {
    }
}

在ServicesCollection中注册自定义解析器

services.Replace(ServiceDescriptor.Transient<IControllerActivator, CustomControllerResolver>());

答案 1 :(得分:0)

我找到了一种避免某些控制器被注册的方法。我们可以注册一个新的约定,该约定需要删除控制器的搜索并将其从控制器的列表中弹出。

public class ApplicationDescription : IApplicationModelConvention
{

    public ApplicationDescription()
    {                      
    }

    public void Apply(ApplicationModel application)
    {
        var ctr = application.Controllers.Where((model) => {
            return model.ControllerType.IsEquivalentTo(typeof(IgnoredController));
        });
        if (ctr.Count() > 0)
        {
            foreach (var controller in ctr.ToList())
            {
                application.Controllers.Remove(controller);
            }
        }            
    }
}

使用MVC注册新约定

public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {



            services.AddMvc((options)=> {

                options.Conventions.Add(new ApplicationDescription());
                options.Conventions.Add(new ControllerDescriptionAttribute("aa"));

            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        { 
        }
    }