Я попытался реализовать Castle Windsor в проекте ASP.NET Web API, следуя руководству по Mark Seemann. Но когда я пытаюсь запустить код, он дает мне исключение ComponentNotFoundException. Я имею в виду, что я должен был зарегистрировать право зависимостей.Windsor ComponentNotFoundException IHttpControllerActivator
Я действительно надеюсь, что у кого-то есть решение моей проблемы. Я попытался найти решение, но без какой-либо удачи.
Global.asax
public class WebApiApplication : System.Web.HttpApplication
{
private readonly IWindsorContainer _container;
public WebApiApplication()
{
_container = new WindsorContainer().Install(new ControllerInstaller());
}
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorCompositionRoot(_container));
}
public override void Dispose()
{
_container.Dispose();
base.Dispose();
}
}
реализация IHttpControllerActivator
public class WindsorCompositionRoot : IHttpControllerActivator
{
private readonly IWindsorContainer _container;
public WindsorCompositionRoot(IWindsorContainer container)
{
_container = container;
}
public IHttpController Create(
HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor,
Type controllerType)
{
var controller =
(IHttpController)_container.Resolve(controllerType);
request.RegisterForDispose(
new Release(
() => _container.Release(controller)));
return controller;
}
private class Release : IDisposable
{
private readonly Action release;
public Release(Action release)
{
this.release = release;
}
public void Dispose()
{
release();
}
}
}
ControllerInstaller
public class ControllerInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IGymnastDataAccess>().ImplementedBy<GymnastDataAccess>());
}
}
Контроллер
public class GymnastController : ApiController
{
private readonly IGymnastDataAccess _gymnastDataAccess;
public GymnastController(IGymnastDataAccess gymnastDataAccess)
{
_gymnastDataAccess = gymnastDataAccess;
}
public IEnumerable<string> Get()
{
_gymnastDataAccess.Load();
return new string[] { "value1", "value2" };
}
}
где вы получили это исключение? –
Извините. В реализации IHttpControllerActivator. (IHttpController) _container.Resolve (controllerType); –
Не можете ли вы посмотреть в режиме отладки, зарегистрирован ли тип GymnastController в контейнере и интерфейс IGymnastDataAccess в контейнере? Простой набор точек останова на линии до (IHttpController) _container.Resolve (controllerType) и вызов в quickwatch _container.Resolve (typeof (IGymnastDataAccess)) –