Decorar ASP.NET Web API IHttpController

Estoy tratando de envolver los controladores de API web (IHttpController implementaciones) con decoradores, pero cuando hago esto, la API web lanza una excepción, porque de alguna manera está esperando la implementación real.

Aplicar decoradores a los controladores es un truco que aplico con éxito a los controladores MVC y obviamente me gusta hacer lo mismo en la API web.

Creé una costumbreIHttpControllerActivator que permite resolver decoradosIHttpController implementaciones Aquí hay una implementación despojada:

public class CrossCuttingConcernHttpControllerActivator : IHttpControllerActivator {
    private readonly Container container;
    public CrossCuttingConcernHttpControllerActivator(Container container) {
        this.container = container;
    }

    public IHttpController Create(HttpRequestMessage request, 
        HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        var controller = (IHttpController)this.container.GetInstance(controllerType);

        // Wrap the instance in one or multiple decorators. Note that in reality, the 
        // decorator is applied by the container, but that doesn't really matter here.
        return new MyHttpControllerDecorator(controller);
    }
}

Mi decorador se ve así:

public class MyHttpControllerDecorator : IHttpController {
    private readonly IHttpController decoratee;
    public MyHttpControllerDecorator(IHttpController decoratee) {
        this.decoratee = decoratee;
    }

    public Task<HttpResponseMessage> ExecuteAsync(
        HttpControllerContext controllerContext,
        CancellationToken cancellationToken)
    {
        // this decorator does not add any logic. Just the minimal amount of code to
        // reproduce the issue.
        return this.decoratee.ExecuteAsync(controllerContext, cancellationToken);
    }
}

Sin embargo, cuando ejecuto mi aplicación y solicito laValuesController, La API web me lanza lo siguienteInvalidCastException:

No se puede convertir el objeto de tipo 'WebApiTest.MyHttpControllerDecorator' para escribir 'WebApiTest.Controllers.ValuesController'.

Stacktrace:

at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<>c__DisplayClass5.<ExecuteAsync>b__4()
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)

Es como si la API web nos proporcionara elIHttpController abstracción pero se la salta y aún depende de la implementación en sí. Esto, por supuesto, sería una grave violación del principio de inversión de dependencia y hará que la abstracción sea completamente inútil. Así que probablemente estoy haciendo algo mal en su lugar.

¿Qué estoy haciendo mal? ¿Cómo puedo decorar felizmente mis controladores API?

Respuestas a la pregunta(3)

Su respuesta a la pregunta