Автоматическое обнаружение контроллера в ядре asp .net - PullRequest
1 голос
/ 22 июня 2019

Asp .net core MVC автоматически определяет контроллеры в проекте при запуске. Я искал способ предотвратить это наверняка Controllers. В результате я понял, что могу реализовать IControllerFactory для динамической фильтрации контроллеров. Однако, как я понимаю, это для создания контроллера, а не для обнаружения. Есть ли другой способ, которым я мог бы сделать это без реализации IControllerFactory или IControllerActivator? Есть ли какой-либо другой компонент, который участвует в обнаружении контроллера при запуске?

IControllerActivator используется IControllerFactory для создания контроллера.

Ответы [ 2 ]

1 голос
/ 23 июня 2019

Вам необходимо реализовать свой собственный 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>());
0 голосов
/ 02 июля 2019

Я нашел способ не допустить регистрации некоторых контроллеров.Мы можем зарегистрировать новое соглашение, при котором поиск контроллеров необходимо удалить, и вытолкнуть их из списка контроллеров.

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)
        { 
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...