Autofac - Украсить все компоненты из конкретной сборки - PullRequest
0 голосов
/ 07 января 2019

Итак, я хочу выполнить профилирование для нескольких контроллеров, которые наследуются от System.Web.Http.ApiController. В проекте, который выполняет профилирование, мы регистрируем их с

builder.RegisterApiControllers(typeof(Web.Modules.AutofacModule).Assembly)
    .As(type => new Autofac.Core.KeyedService("api", type));

Позже я пытаюсь зарегистрировать декоратор для каждого с

builder.RegisterDecorator<ApiController>(original => Decorate(original, profiler), 
    fromKey: "api");

, где Decorate вводит некоторый код профилирования через DelegatingHandler и возвращает оригинал.

Я могу разрешить контроллеры просто отлично:

scope.ResolveKeyed<RegistrationController>("api");

но код профилирования никогда не вызывается и Decorate.

Моей первой мыслью было, что, возможно, мне нужно зарегистрировать компоненты контроллера как ApiController, но сброс .As<ApiController>() чуть ниже первого фрагмента не удался.

Любая помощь будет супер. Это, вероятно, сводится к тому, что у меня нет Autofac-fu.

1 Ответ

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

Итак, я хочу выполнить профилирование для нескольких контроллеров, которые наследуются от System.Web.Http.ApiController.

Это невозможно. Это не имеет никакого отношения к Autofac, но к способу разработки ASP.NET Web API.

Несмотря на то, что контроллеры веб-API являются производными от общего базового класса, веб-API ASP.NET требует использования исходного типа контроллера. Другими словами, когда он запрашивает HomeController у IHttpControllerActivator, он ожидает точный тип (или подтип), но не родственный тип (другая производная ApiController).

Я думаю, что это ограничение существует, потому что Web API использует рефлексию для поиска реальных методов действий. Но когда вы возвращаете декоратор, эти методы исчезают, потому что декоратор применяет композицию вместо наследования. Это сильно отличается от того, как спроектирован ASP.NET MVC. MVC действительно позволяет декорировать контроллеры, так как он всегда вызывает метод IController.Execute. Поэтому реализация IController является единственным требованием MVC к контроллерам.

Таким образом, даже если вы настроите Autofac для переноса любых производных ApiController в Decorator, Web API просто не позволит вам.

Способ применения сквозных проблем при вызове методов действий в веб-API заключается в использовании делегирующих обработчиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...