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 с этим именем свойства.
Есть идеи?