0

Я попытался реализовать 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" }; 
    } 
} 
+0

где вы получили это исключение? –

+0

Извините. В реализации IHttpControllerActivator. (IHttpController) _container.Resolve (controllerType); –

+0

Не можете ли вы посмотреть в режиме отладки, зарегистрирован ли тип GymnastController в контейнере и интерфейс IGymnastDataAccess в контейнере? Простой набор точек останова на линии до (IHttpController) _container.Resolve (controllerType) и вызов в quickwatch _container.Resolve (typeof (IGymnastDataAccess)) –

ответ

0

Виндзорский замок не поддерживает автоматическую решительность конкретных классов из коробки, так что вы должны зарегистрировать свой класс контроллера в контейнере:

container.Register(Component.For<GymnastController>()); 

или реализовать ILazyComponentLoader как here получить автоматическое решение конкретных классов.

+0

Спасибо, что работает для меня. Я использовал его в другом проекте с автоматическим разрешением, но они, возможно, внедрили некоторую автоматическую ленивую загрузку. –

Смежные вопросы