Web API, odata v4 and Castle Windsor

喜夏-厌秋 提交于 2019-12-20 03:52:35

问题


I have WebApi project with ODataController and I'm trying to inject some dependency into MyController. I was following this blogpost by Mark Seemann.

Consider code below.

Problem is, that when is MyController creating, I got exception inside WindsorCompositionRoot Create method on this line,

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

An exception of type 'Castle.MicroKernel.ComponentNotFoundException' occurred in Castle.Windsor.dll but was not handled in user code

Additional information: No component for supporting the service System.Web.OData.MetadataController was found

Any idea how to fix this? Thank you.

My controller:

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

回答1:


Make sure you're registering all your controllers with the container:

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 uses installers to encapsulate and partition registration logic. It also includes a helper called FromAssembly, so you don't need to manually instantiate all your installers:

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


来源:https://stackoverflow.com/questions/26518530/web-api-odata-v4-and-castle-windsor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!