Декорирование ASP.NET Web API IHttpController

я пытаюсь обернуть контроллеры Web API (IHttpController реализации) с декораторами, но когда я делаю это, Web API выдает исключение, потому что он каким-то образом ожидает фактической реализации.

Применение декораторов к контроллерам - это уловка, которую я успешно применяю к контроллерам MVC, и мне, очевидно, нравится делать то же самое в Web API.

Я создал кастомIHttpControllerActivator что позволяет разрешить оформленныйIHttpController Реализации. Вот's раздетая реализация:

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);
    }
}

Мой декоратор выглядит так:

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

    public Task 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);
    }
}

Однако, когда я запускаю свое приложение и запрашиваюValuesControllerWeb API выдает мне следующее:InvalidCastException

Невозможно привести объект типа 'WebApiTest.MyHttpControllerDecorator» печатать 'WebApiTest.Controllers.ValuesController.

Трассировки стека:

at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c__DisplayClass13.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.b__4()
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)

Это'Так же, как если бы веб-API предоставляет намIHttpController абстракция, но пропускает это и все еще зависит от самой реализации. Это, конечно, будет серьезным нарушением принципа инверсии зависимости и сделает абстракцию совершенно бесполезной. Так что я'Я, вероятно, делаю что-то не так.

Что я'я не так делаю? Как я могу счастливо украсить свои контроллеры API?

Ответы на вопрос(3)

Ваш ответ на вопрос