【问题标题】:Web API, odata v4 and Castle WindsorWeb API、odata v4 和温莎城堡
【发布时间】:2015-01-05 20:41:48
【问题描述】:

我有带有 ODataController 的 WebApi 项目,我正在尝试将一些依赖项注入 MyController。我关注的是 Mark Seemann 的 blogpost

考虑下面的代码。

问题是,当 MyController 创建时,我在这一行的 WindsorCompositionRoot Create 方法中出现异常,

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

全球 asax

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

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

【问题讨论】:

  • 您确定收到此错误时的“controllerType”是 MyController 类型吗?

标签: asp.net-mvc asp.net-web-api dependency-injection odata castle-windsor


【解决方案1】:

确保您在容器中注册了所有控制器:

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

【讨论】:

  • 要修复错误,您可能还需要从 System.Web.OData 程序集注册 MetadataController:container.Register(Classes.FromAssembly(Assembly.GetAssembly(typeof(System.Web.OData.MetadataController))).BasedOn&lt;System.Web.Http.ApiController&gt;().LifestylePerWebRequest()); 改编自 https://github.com/aspnetboilerplate/aspnetboilerplate/issues/711
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多