ASP Web Api - IoC - Разрешить HttpRequestMessage

Я пытаюсь настроить Castle Windsor с помощью ASP.NET WebAPI.

Я также использую пакет Hyprlinkr (https://github.com/ploeh/Hyprlinkr) и поэтому нужен экземпляр HttpRequestMessage, внедренный в одну из зависимостей моего контроллера.

Я следую за этой статьей Марка Симэнна -http://blog.ploeh.dk/2012/04/19/WiringHttpControllerContextWithCastleWindsor.aspx , но я обнаружил, что, хотя API работает, когда я звоню ему, запрос просто зависает. Нет сообщения об ошибке. Это'как будто этос бесконечным циклом. Это'висит на вызове Resolve в моем Custom ControllerActivator

Я думаю, что некоторые из моих регистраций в замке неверны. Если я удаляю те, что упомянуты в статье выше, тогда я могу успешно сделать вызов API (хотя без зависимостей, которые мне нужно разрешить)

Есть идеи?

Код ниже

//Global.asax
public class WebApiApplication : HttpApplication
{
    private readonly IWindsorContainer container;

    public WebApiApplication()
    {
        container = 
            new WindsorContainer(
                new DefaultKernel(
                    new InlineDependenciesPropagatingDependencyResolver(), 
                    new DefaultProxyFactory()), 
                new DefaultComponentInstaller());

        container.Install(new DependencyInstaller());
    }

    protected void Application_Start()
    {        
        GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorCompositionRoot(this.container));
    }

// installer
public class DependencyInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.AddFacility();

        container.Register(
            Component.For()
                .Named("ValuesController")
                .LifeStyle.PerWebRequest,

            Component.For()
                .ImplementedBy()
                .LifeStyle.PerWebRequest,

            Component.For()
                .ImplementedBy()
                .LifeStyle.PerWebRequest,

                Component.For()
                .Named("HttpRequestMessage")
                .LifeStyle.PerWebRequest
            );
    }
}

//Activator

public class WindsorCompositionRoot : IHttpControllerActivator
{
    private readonly IWindsorContainer container;

    public WindsorCompositionRoot(IWindsorContainer container)
    {
        this.container = container;
    }

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

        request.RegisterForDispose(
            new Release(
                () => this.container.Release(controller)));

        return controller;
    }

// DependencyResolver   
public class InlineDependenciesPropagatingDependencyResolver : DefaultDependencyResolver
{
    protected override CreationContext RebuildContextForParameter(CreationContext current, Type parameterType)
    {
        if (parameterType.ContainsGenericParameters)
        {
            return current;
        }

        return new CreationContext(parameterType, current, true);
    }
}

РЕДАКТИРОВАТЬ *********** ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ ****************

Поэтому я настроил сценарий, в котором контроллер просто принимает HttpRequestMessage в качестве аргумента ctor и находит:

Это работает:

//controller
public class ValuesController : ApiController
    {
        private readonly HttpRequestMessage _httpReq;

        public ValuesController(HttpRequestMessage httpReq)
        {
            _httpReq = httpReq;
        }
//IHttpControllerActivator
public IHttpController Create(
            HttpRequestMessage httpRequest,
            HttpControllerDescriptor controllerDescriptor,
            Type controllerType)
        {

            var controller = (IHttpController)this.container.Resolve(
                controllerType, new { httpReq = httpRequest });

            return controller;

Тем не менее, это нет.

//controller
public class ValuesController : ApiController
    {
        private readonly HttpRequestMessage _httpReq;

        public ValuesController(HttpRequestMessage request)
        {
            _httpReq = request;
        }

//IHttpControllerActivator
public IHttpController Create(
            HttpRequestMessage request,
            HttpControllerDescriptor controllerDescriptor,
            Type controllerType)
        {

            var controller = (IHttpController)this.container.Resolve(
                controllerType, new { request = request });

            return controller;

то есть когда объект anon имеет свойство с именем "запрос" а контроллер ctor arg называется "запрос", Это как-то заставляет контроллер думать об этомСвойство запроса s имеет значение null. Что является причиной ошибки, которую я вижу:

Не могу использоватьApiController» пример. 'ApiController» должен быть построен для каждого входящего сообщения. Проверьте свой обычай "IHttpControllerActivator» и убедитесь, что он не будет производить тот же экземпляр.

на System.Web.Http.ApiController.ExecuteAsync (HttpControllerContext controllerContext, CancellationToken CancellationToken) в System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal (HttpRequestMessage запрос, CancellationToken CancellationToken) в System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync (HttpRequestMessage запрос, CancellationToken CancellationToken)

прочитайте этоКак я могу обогатить композицию объекта в StructureMap, не вызывая инъекцию сеттера?

Это объясняет похожий сценарий.

Конечно, у Hyprlinkr естьs ctor arg для HttpRequestMessage называется "запрос", поэтому мне нужно указать объект anon с этим именем свойства.

Есть идеи?

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

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