1

У меня есть проект WebApi с ODataController, и я пытаюсь добавить некоторую зависимость в MyController. Я следил за этим blogpost Марк Seemann.Веб-API, odata v4 и Castle Windsor

Рассмотрите приведенный ниже код.

Проблема заключается в том, что, когда это MyController создания, я получил исключение внутри WindsorCompositionRoot Создать метод на этой линии,

var controller = (IHttpController)this.container.Resolve(controllerType); 

исключение типа «Castle.MicroKernel.ComponentNotFoundException» произошло в Castle.Windsor .dll, но не был обработан в пользовательском коде

Дополнительная информация: нет компонент для поддержки услуги System.Web.OData.MetadataController был найден

Любая идея, как это исправить? Спасибо.

Мой контроллер:

public class MyController : ODataController 
{ 
    private readonly DataLayer _db; 

    public PrepravyController(DataLayer db) 
    { 
     _db = db; 
    } 
} 

CompositonRoot:

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

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

     return controller; 
    } 

    private class Release : IDisposable 
    { 
     private readonly Action release; 

     public Release(Action release) 
     { 
      this.release = release; 
     } 

     public void Dispose() 
     { 
      this.release(); 
     } 
    } 
} 

Global asax:

var container = new WindsorContainer(); 
     container.Install(new RepositoriesInstaller()); 

     GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorCompositionRoot(container)); 
        GlobalConfiguration.Configure(WebApiConfig.Register); 
+0

Вы уверены, что «controllerType» в то время, вы получите это ошибка типа MyController? – PatrickSteele

ответ

2

Убедитесь, что вы «Повторно регистрировать все контроллеры с контейнером:

public class ControllerInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestylePerWebRequest()) 
       .Register(Classes.FromThisAssembly().BasedOn<ApiController>().LifestylePerWebRequest()); 
    } 
} 

Windsor использует монтажник для инкапсуляции и регистрация разделов логики. Она также включает в себя помощник под названием FromAssembly, так что вам не нужно вручную создать экземпляр всех монтажников:

_container = new WindsorContainer(); 
_container.Install(FromAssembly.This()); 
+0

, чтобы исправить ошибку, вам также может потребоваться зарегистрировать MetadataController из сборки System.Web.OData: 'container.Register (Classes.FromAssembly (Assembly.GetAssembly (typeof (System.Web.OData.MetadataController))). BasedOn (). LifestylePerWebRequest()); ' адаптирован из [https://github.com/aspnetboilerplate/aspnetboilerplate/issues/711](https://github.com/aspnetboilerplate/ aspnetboilerplate/вопросы/711) – micdemarco

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